如何在 Delphi 中获取锁定文件的句柄?

问题描述 投票:0回答:5

LockFile API 需要一个文件句柄。我通常使用 TStream 进行文件访问,因此我不确定如何在仅给定 ANSIString 文件名的情况下获取适当的句柄。我的目的是在一个进程中锁定一个文件(本来可能不存在),向其他用户写入一些信息,然后解锁并删除。

我希望有示例代码或指向它的指针,以使其可靠。

delphi locking
5个回答
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
投票

您可以在此处找到使用LockFile API 的完整示例。 它用于检测网络中正在使用的计算机。它是在 Delphi 6 中编译的,并包含源代码。

请原谅我的英语不好。

问候。


0
投票

现在来了下一个问题,检测文件何时被另一个应用程序解锁,例如 ProcessExplorer 等

换句话说:

  1. 我们的APP丢失了文件
  2. 我们的APP可以做事
  3. 另一个应用程序解锁文件(也可能删除它),可能由另一个用户(管理员、系统等)运行
  4. 我们的APP需要检测此类“事件”<-- How is that done?

我想到了两个想法:一个 TTimer 来检查 TFileStream 处理程序是否仍然有效(但我不知道如何做到这一点)或一个“事件”处理程序,它是来自系统的回调(我也不知道如何做到这一点) ).

澄清要点:想象一下,您一次只希望一个用户可以运行该应用程序,但某些用户拥有“管理员”权限!!!

© www.soinside.com 2019 - 2024. All rights reserved.