【问题标题】:How do I get the handle for locking a file in Delphi?如何获得在 Delphi 中锁定文件的句柄?
【发布时间】:2009-12-16 17:00:56
【问题描述】:

LockFile API 采用文件句柄。我通常使用 TStream 进行文件访问,所以我不确定如何获得适当的句柄,只给定一个 ANSIString 文件名。我的目的是在一个进程中锁定一个文件(原本可能不存在),写一些信息给其他用户,然后解锁删除。

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

【问题讨论】:

    标签: delphi locking


    【解决方案1】:

    您可以将 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;
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 这和锁不太一样吧?通过网络连接到共享驱动器是否安全?我必须能够尽可能合理地保证。
        • 好的,我已经阅读了源代码,它确实以锁调用告终,所以很好。
        【解决方案4】:

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

        对不起,我的英语不好。

        问候。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多