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 29 - 32)

0, // tạo tên duy nhất

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

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.

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.

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) (adsbygoogle = window.adsbygoogle || []).push({});

{

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

0, // không chia s

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

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); 7.3.6 đó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. (adsbygoogle = window.adsbygoogle || []).push({});

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 29 - 32)