Pascal 拉扎勒斯:如何检查文件是否正在使用?

Pascal 拉扎勒斯:如何检查文件是否正在使用?,pascal,lazarus,file-access,file-in-use,Pascal,Lazarus,File Access,File In Use,在尝试访问某个文件之前,我需要检查该文件是否正在使用中。有没有办法在Lazarus环境中执行此操作?使用FileOpen(FileName、fmOpenReadWrite或fmShareExclusive)打开文件并检查结果 更新(感谢肯·怀特的评论)。这不是对您问题的直接回答,因为FileOpen实际上可以访问该文件,但是您不应该执行检查然后打开该文件,否则您将获得竞争条件。您应该打开文件,然后检查打开是否成功 使用FileOpen打开文件并通过其句柄访问文件可能看起来不熟悉。当在try ex

在尝试访问某个文件之前,我需要检查该文件是否正在使用中。有没有办法在Lazarus环境中执行此操作?

使用
FileOpen(FileName、fmOpenReadWrite或fmShareExclusive)
打开文件并检查结果

更新(感谢肯·怀特的评论)。这不是对您问题的直接回答,因为
FileOpen
实际上可以访问该文件,但是您不应该执行检查然后打开该文件,否则您将获得竞争条件。您应该打开文件,然后检查打开是否成功


使用
FileOpen
打开文件并通过其句柄访问文件可能看起来不熟悉。当在
try except
块中使用例如
Rewrite
打开文件时,可以实现相同的目标。我对Lazarus不太清楚,但是在Delphi中,使用高级文件例程使用
try except
需要在异常情况下显式重置IOResult(将
SetInOutRes(0)
放入
except
部分),否则以下文件操作将失败。

使用
FileOpen打开文件(文件名、fmOpenReadWrite或fmShareExclusive)
并检查结果

更新(感谢肯·怀特的评论)。这不是对您问题的直接回答,因为
FileOpen
实际上可以访问该文件,但您不应该先执行检查,然后再打开该文件,否则您将获得竞争条件。您应该打开该文件,然后检查打开是否成功


使用
FileOpen
打开文件并通过其句柄访问文件可能看起来不太熟悉。当在
try except
块中使用
Rewrite
打开文件时,可以实现相同的目标。我不确定Lazarus的情况,但在Delphi中使用
try except
高级文件例程需要明确的提示在异常情况下重置IOResult(将
SetInOutRes(0)
放入
部分),否则以下文件操作将失败。

您不会。您尝试打开它,如果无法打开,则处理异常

首先检查它是否在使用中没有任何作用

Your code to see if it's in use says it's not
--->>> Another app opens the file, locking it
Your code to open file fails
相反,使用正常的
try..except
块:

try
  FS := TFileStream.Create(YourFileName, fmOpenReadWrite, fmShareExclusive);
  // Code to use file here
except
  // Handle failure to access file
end;

你没有。你试着打开它,当你不能打开时处理异常

首先检查它是否在使用中没有任何作用

Your code to see if it's in use says it's not
--->>> Another app opens the file, locking it
Your code to open file fails
相反,使用正常的
try..except
块:

try
  FS := TFileStream.Create(YourFileName, fmOpenReadWrite, fmShareExclusive);
  // Code to use file here
except
  // Handle failure to access file
end;

try…except
construct对你来说不够好吗?
try…except
construct对你来说不够好吗?当然。我应该在我的回答中补充一点,测试应该在访问的同时进行,否则会有竞争条件。还有其他方法,比如在try-except块中打开文件。使用
FileOpen
只是提供了一种无异常的方式来执行检查。当然。我应该在我的回答中补充一点,即测试应该在获得访问权限的同时执行,否则会出现竞争条件。还有其他方式,比如在try except块中打开文件。使用
FileOpen
只是提供了一种无异常的方式执行检查。如果您的I/O不是基于流的,则使用$I+/I-并检查ioresult。如果您的I/O不是基于流的,则使用$I+/I-并检查ioresult。