2009-12-16 82 views
4

LockFile API需要一個文件句柄。我通常使用TStream進行文件訪問,所以我不確定如何獲得適當的句柄,只給出一個ANSIString文件名。我的目的是在進程中鎖定一個文件(最初可能不存在),向其他用戶寫入一些信息,然後解鎖並刪除它。如何獲取在Delphi中鎖定文件的句柄?

我將不勝感激示例代碼或指針,使其可靠。

回答

7

可以使用結合的和LockFile功能與CreateFileUnlockFile功能。

見這個例子

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; 

注意:在這兩個例子中的訪問是隻讀的,則必須更改標誌,以寫入文件。

6

這其實很簡單。 TFileStream有一個Handle屬性,爲你提供文件的Windows句柄。如果您使用其他類型的流,則不需要使用底層文件。

3

另一種選擇是創建一個具有獨佔讀/寫訪問的文件流:

fMask := fmOpenReadWrite or fmShareExclusive; 
if not FileExists(Filename) then 
    fMask := fMask or fmCreate; 
fstm := tFileStream.Create(Filename,fMask); 
+0

雖然這不是一個鎖是相同的嗎?它是否可以通過網絡安全地共享驅動器?我必須能夠儘可能地保證它。 – mj2008 2009-12-17 08:51:36

+0

好吧,我已經讀過了源代碼,它確實在鎖定呼叫時結束了,所以它很好。 – mj2008 2009-12-17 08:59:49

0

你可以找到使用和LockFile API here一個完整的樣本。 它用於檢測使用網絡的計算機。它在Delphi 6中編譯幷包含源代碼。

對不起我英文不好的原因。

問候。

+0

樣本已經過去,404錯誤... – mjn 2011-09-28 10:37:24

+0

這是舊的服務器;你可以在這裏找到這個文件: http://neftali.clubdelphi.com/?p=172 我已經更新了鏈接。謝謝。 – 2011-09-28 13:31:55