Khoá và mở khoá tập tin

Một phần của tài liệu Quản lý bộ nhớ và tập tin (Trang 30 - 33)

Mặc dù hệ thống cho phép nhiều ứng dụng có thể mở và ghi vào cùng một tập tin, các ứng dụng không nên thực hiện song song. Để ngăn chặn ứng dụng khác ghi vào phần dữ liệu của mình, ta có thể sử dụng hàm LockFile. Để mở khoá tập tin, cho phép các ứng dụng khác truy cập vùng dữ liệu, ta dùng hàm UnlockFile.

BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD

dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD

nNumberOfBytesToLockHigh);

BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD

dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD

nNumberOfBytesToUnlockHigh);

Trường hFile là handle của tập tin được mở dưới dạng GENERAL_READ hoặc GENERAL_WRITE, hoặc cả hai.

Trường dwFileOffsetLow và dwFileOffsetHigh xác định word thấp và cao của byte offset đầu tiên cần khoá hay mở khoá.

Trường nNumberofBytesToLockLow (nNumberofBytesTo UnlockLow) và nNumberOfBytesToLockHigh (nNumberOf BytesToUnlockHigh) xác định word thấp và cao độ dài khoảng byte cần khoá hay mở khóa.

Ví dụ sau đây nối một tập tin vào một tập tin khác. Ứng dụng sử dụng hàm CreateFile

mở tập tin ONE.TXT để đọc, và TWO.TXT để viết. Sau đó ứng dụng nối phần dữ liệu của tập tin ONE.TXT vào cuối tập tin TWO.TXT bằng cách đọc (dùng hàm ReadFile) và ghi (dùng hàm WriteFile) từng khối 4K dữ liệu. Trước khi viết vào tập tin thứ hai, ứng dụng dịch chuyển con trỏ đến cuối tập tin bằng cách dùng hàm SetFilePointer, sau đó khóa vùng cần ghi dùng hàm LockFile. Sau khi thực hiện thao tác ghi xong, ta mở khoá, dùng hàm UnlockFile, để các ứng dụng khác có thể sử dụng tập tin này.

HANDLE hFile;

HANDLE hAppend;

DWORD dwBytesRead, dwBytesWritten, dwPos;

char buff[4096];

/* Mở một tập tin đã có */

hFile = CreateFile("ONE.TXT", // mở tập tin ONE.TXT

GENERIC_READ, // mởđểđọc

0, // không chia sẻ

NULL, // không bảo mật

OPEN_EXISTING, // chỉ mở tập tin đã tồn tại

FILE_ATTRIBUTE_NORMAL, // tập tin bình thường

NULL); // không có thuộc tính tạm

if (hFile == INVALID_HANDLE_VALUE)

{

ErrorHandler("Could not open ONE."); // xử lý lỗi

}

/* Mở tập tin đã có. Nếu chưa có, tạo tập tin mới */

hAppend = CreateFile("TWO.TXT", // mở tập tin TWO.TXT

GENERIC_WRITE, // mởđể ghi (adsbygoogle = window.adsbygoogle || []).push({});

0, // không chia sẻ

OPEN_ALWAYS, // mở tập tin cũ hoặc tạo mới

FILE_ATTRIBUTE_NORMAL, // tập tin bình thường

NULL); // không có thuộc tính tạm

if (hAppend == INVALID_HANDLE_VALUE)

{

ErrorHandler("Could not open TWO."); // xử lý lỗi

}

/* Nối tập tin thứ nhất vào cuối tập tin thứ hai. Khoá tập tin thứ hai để ngăn chặn các tiến trình khác truy cập khi đang ghi. Mở khoá sau khi ghi xong */

do {

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); } while (dwBytesRead == 4096); /* Đóng cả hai tập tin */ CloseHandle(hFile); CloseHandle(hAppend); Đóng và xoá tp tin

Để sử dụng hiệu quả tài nguyên hệ thống, ứng dụng cần đóng các tập tin khi không cần dùng nữa bằng cách gọi hàm CloseHandle. Nếu ứng dụng bị ngắt và tập tin vẫn đang mở, hệ thống sẽ tự động đóng tập tin này.

BOOL CloseHandle(HANDLE hObject);

Nếu thành công, hàm trả về giá trị khác 0. Ngược lại, giá trị trả về là 0. Để biết các thông tin lỗi mở rộng, ta dùng hàm GetLastError.

Để xoá một tập tin, ta dùng hàm DeleteFile. Lưu ý rằng tập tin này cần phải đóng trước khi bị xóa.

BOOL DeleteFile(LPCTSTR lpFileName);

Trường lpFileName trỏ đến chuỗi (kết thúc bằng ký tự NULL) xác định tập tin cần xoá. Nếu thành công, hàm trả về khá trị khác 0. Ngược lại, giá trị trả về là 0. Hàm thất bại nếu tập nếu tập tin cần xoá không tồn tại. Trong Windows NT, hàm không thể xoá các tập tin đang mở. Tuy nhiên, trong Windows 95, tập tin đang mở vẫn có thể bị xoá.

Một phần của tài liệu Quản lý bộ nhớ và tập tin (Trang 30 - 33)