【发布时间】:2009-12-16 17:00:56
【问题描述】:
LockFile API 采用文件句柄。我通常使用 TStream 进行文件访问,所以我不确定如何获得适当的句柄,只给定一个 ANSIString 文件名。我的目的是在一个进程中锁定一个文件(原本可能不存在),写一些信息给其他用户,然后解锁删除。
我希望有示例代码或指向它的指针以使其可靠。
【问题讨论】:
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);
【讨论】:
【讨论】: