开发者

How do I get the handle for locking a file in Delphi?

The LockFile API takes a file handle. I normally use TStream for file access, so I'm unsure how to get the appropriate handle, given an ANSIString filename only. My purpose is to lock a file (which may not exist originally) during a process, write some information to other users, and then unlock and delete it.

I开发者_开发百科 would appreciate sample code or pointers to it to make this reliable.


You can use the LockFile function in conjunction with CreateFile and UnlockFile functions.

See this example

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;

Another option , if you want to lock the file using TFileStream you can opening the file using exclusive access (fmShareExclusive).

Var
MyStream :TFilestream;
begin
  MyStream := TFilestream.Create( aFileName, fmOpenRead or fmShareExclusive ); 

end;

Note : in both examples the access is read-only, you must change the flags in order to write the files.


It's pretty simple, actually. TFileStream has a Handle property that gives you the Windows handle to the file. And if you're using some other type of stream, there's no underlying file to work with.


Another option is to create a file stream with exclusive read/write access:

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


you can find a complete sample to use LockFile API here. It's used to detect computer in use insede a network. It's compiled in Delphi 6 and source is included.

Excuse-me for my bad english.

Regards.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜