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

如何在Delphi中获得锁定文件的句柄?,delphi,locking,Delphi,Locking,API接受一个文件句柄。我通常使用TStream进行文件访问,因此我不确定如何获得适当的句柄,因为只有一个ANSIString文件名。我的目的是在一个过程中锁定一个文件(可能原本不存在),向其他用户写入一些信息,然后解锁并删除它 我将非常感谢示例代码或指向它的指针,以使其可靠 实际上,这很简单。TFileStream有一个Handle属性,它为您提供文件的Windows句柄。如果您使用的是其他类型的流,则没有可处理的底层文件。您可以将LockFile函数与和函数结合使用 看这个例子 proced

API接受一个文件句柄。我通常使用TStream进行文件访问,因此我不确定如何获得适当的句柄,因为只有一个ANSIString文件名。我的目的是在一个过程中锁定一个文件(可能原本不存在),向其他用户写入一些信息,然后解锁并删除它


我将非常感谢示例代码或指向它的指针,以使其可靠

实际上,这很简单。TFileStream有一个Handle属性,它为您提供文件的Windows句柄。如果您使用的是其他类型的流,则没有可处理的底层文件。

您可以将LockFile函数与和函数结合使用

看这个例子

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)打开文件


注意:在这两个示例中,访问都是只读的,您必须更改标志才能写入文件。

另一个选项是创建具有独占读/写访问权限的文件流:

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

您可以找到一个完整的示例来使用LockFileAPI。 它用于检测网络中使用的计算机。它是在Delphi6中编译的,包含了源代码

请原谅我英语不好


问候。

这和锁不太一样,是吗?通过网络连接到共享驱动器是否安全?我必须尽可能合理地保证它。好的,我已经阅读了源代码,它确实以锁定调用结束,所以它很好。这是旧服务器;你可以在这里找到这个文件:我已经更新了链接。谢谢
fMask := fmOpenReadWrite or fmShareExclusive;
if not FileExists(Filename) then
  fMask := fMask or fmCreate;
fstm := tFileStream.Create(Filename,fMask);