LockFile API需要一個文件句柄。我通常使用TStream進行文件訪問,所以我不確定如何獲得適當的句柄,只給出一個ANSIString文件名。我的目的是在進程中鎖定一個文件(最初可能不存在),向其他用戶寫入一些信息,然後解鎖並刪除它。如何獲取在Delphi中鎖定文件的句柄?
我將不勝感激示例代碼或指針,使其可靠。
LockFile API需要一個文件句柄。我通常使用TStream進行文件訪問,所以我不確定如何獲得適當的句柄,只給出一個ANSIString文件名。我的目的是在進程中鎖定一個文件(最初可能不存在),向其他用戶寫入一些信息,然後解鎖並刪除它。如何獲取在Delphi中鎖定文件的句柄?
我將不勝感激示例代碼或指針,使其可靠。
可以使用結合的和LockFile功能與CreateFile和UnlockFile功能。
見這個例子
procedure TFrmMain.Button1Click(Sender: TObject);
var
aHandle : THandle;
aFileSize : Integer;
aFileName : String;
begin
aFileName :='C:\myfolder\myfile.ext';
aHandle := CreateFile(PChar(aFileName),GENERIC_READ, 0, nil, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); // get the handle of the file
try
aFileSize := GetFileSize(aHandle,nil); //get the file size for use in the lockfile function
Win32Check(LockFile(aHandle,0,0,aFileSize,0)); //lock the file
//your code
//
//
//
Win32Check(UnlockFile(aHandle,0,0,aFileSize,0));//unlock the file
finally
CloseHandle(aHandle);//Close the handle of the file.
end;
end;
另一種選擇,如果你想使用鎖定您TFileStream的使用可以獨佔訪問(fmShareExclusive)打開文件的文件。
Var
MyStream :TFilestream;
begin
MyStream := TFilestream.Create(aFileName, fmOpenRead or fmShareExclusive);
end;
注意:在這兩個例子中的訪問是隻讀的,則必須更改標誌,以寫入文件。
這其實很簡單。 TFileStream有一個Handle屬性,爲你提供文件的Windows句柄。如果您使用其他類型的流,則不需要使用底層文件。
另一種選擇是創建一個具有獨佔讀/寫訪問的文件流:
fMask := fmOpenReadWrite or fmShareExclusive;
if not FileExists(Filename) then
fMask := fMask or fmCreate;
fstm := tFileStream.Create(Filename,fMask);
雖然這不是一個鎖是相同的嗎?它是否可以通過網絡安全地共享驅動器?我必須能夠儘可能地保證它。 – mj2008 2009-12-17 08:51:36
好吧,我已經讀過了源代碼,它確實在鎖定呼叫時結束了,所以它很好。 – mj2008 2009-12-17 08:59:49