LockFile API 需要一个文件句柄。我通常使用 TStream 进行文件访问,因此我不确定如何在仅给定 ANSIString 文件名的情况下获取适当的句柄。我的目的是在一个进程中锁定一个文件(本来可能不存在),向其他用户写入一些信息,然后解锁并删除。
我希望有示例代码或指向它的指针,以使其可靠。
您可以将 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);
现在来了下一个问题,检测文件何时被另一个应用程序解锁,例如 ProcessExplorer 等
换句话说:
我想到了两个想法:一个 TTimer 来检查 TFileStream 处理程序是否仍然有效(但我不知道如何做到这一点)或一个“事件”处理程序,它是来自系统的回调(我也不知道如何做到这一点) ).
澄清要点:想象一下,您一次只希望一个用户可以运行该应用程序,但某些用户拥有“管理员”权限!!!