代码之家  ›  专栏  ›  技术社区  ›  mj2008

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

  •  4
  • mj2008  · 技术社区  · 15 年前

    这个 LockFile API接受一个文件句柄。我通常使用tstream进行文件访问,所以我不确定如何获得适当的句柄,只给出一个ansistring文件名。我的目的是在一个过程中锁定一个文件(可能不存在),向其他用户写入一些信息,然后解锁并删除它。

    我希望示例代码或指向它的指针能够使其可靠。

    4 回复  |  直到 13 年前
        1
  •  7
  •   RRUZ    15 年前

    你可以使用 锁文件 功能与 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;
    

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

        2
  •  6
  •   Mason Wheeler    15 年前

    实际上,这很简单。tfilestream有一个handle属性,它为您提供该文件的Windows句柄。如果您使用的是其他类型的流,那么就没有可以使用的底层文件。

        3
  •  3
  •   skamradt    15 年前

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

    fMask := fmOpenReadWrite or fmShareExclusive;
    if not FileExists(Filename) then
      fMask := fMask or fmCreate;
    fstm := tFileStream.Create(Filename,fMask);
    
        4
  •  0
  •   Germán Estévez -Neftalí-    13 年前

    你可以找到一个完整的样本来使用 锁文件 美国石油学会 here . 它用于检测网络中使用的计算机。它是用Delphi6编译的,包含了源代码。

    请原谅我的英语不好。

    当做。