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

可紊 提交于 2019-12-12 11:20:38

问题


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.


回答1:


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.




回答2:


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.




回答3:


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);



回答4:


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.



来源:https://stackoverflow.com/questions/1916084/how-do-i-get-the-handle-for-locking-a-file-in-delphi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!