• Thứ Sáu, 19/10/2007 09:52 (GMT+7)

    Lập trình C++ thực hiện các lệnh mở file

    Câu hỏi :
    Xin hướng dẫn đoạn code C++ thực hiện các lệnh mở file, và mở nhanh file đó với các chương trình khác nhau.

     

    Trả lời :

    Bạn có thể dùng 1 trong nhiều thư viện C hay C++ khác nhau ở các mức độ từ thấp đến cao để truy xuất file, tuy nhiên để dễ dàng kiểm soát việc truy xuất file đồng thời bởi nhiều ứng dụng khác nhau, bạn nên dùng các hàm API của Windows hay các class đối tượng có sẵn trong MFC. Sau đây là đoạn code C++ thí dụ trong CD MSDN dùng các hàm API Windows như CreateFile, ReadFile, WriteFile, LockFile, UnLockFile, CloseHandle... để đọc nội dung file one.txt rồi ghi vào cuối file two.txt có sẵn:

     //khai báo các biến cần dùng
     HANDLE hFile;
     HANDLE hAppend;
     DWORD dwBytesRead, dwBytesWritten, dwPos;
     char buff[4096];
     // Mở file one.txt đã có sẵn
     hFile = CreateFile("ONE.TXT", // open ONE.TXT
     GENERIC_READ, // open for reading
     0, // do not share
     NULL, // no security
     OPEN_EXISTING, // existing file only
     FILE_ATTRIBUTE_NORMAL, // normal file
     NULL); // no attr. template
     
     //kiểm tra kết quả
     if (hFile == INVALID_HANDLE_VALUE) {
     ErrorHandler("Could not open ONE."); // process error
     }
     
     //Mở file two.txt, nếu chưa có thì tạo mới
     hAppend = CreateFile("TWO.TXT", // open TWO.TXT
     GENERIC_WRITE, // open for writing
     0, // do not share
     NULL, // no security
     OPEN_ALWAYS, // open or create
     FILE_ATTRIBUTE_NORMAL, // normal file
     NULL); // no attr. template
     
     //kiểm tra kết quả
     if (hAppend == INVALID_HANDLE_VALUE) {
     ErrorHandler("Could not open TWO."); // process error
     }
     
     //Đọc nội dung file one.txt rồi ghi vào cuối file two.txt
     //Có khóa file two.txt để cấm ứng dụng khác truy xuất trong lúc ghi dữ liệu
     //Rồi mở khóa sau khi hoạt động ghi hoàn thành
     do {
     //lặp đọc từng khối 4096 byte dữ liệu
     if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) {
     dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
     LockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
     WriteFile(hAppend, buff, dwBytesRead,&dwBytesWritten, NULL);
     UnlockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
     }
     } while (dwBytesRead == 4096);
     
     // Đóng cả 2 file lại
     CloseHandle(hFile);
     CloseHandle(hAppend); 

    Chuyên mục: Lập trình