什么可能导致意外的'文件在使用'错误

时间:2014-09-22 15:35:26

标签: delphi winapi file-io delphi-5

我有一个Delphi5应用程序,它将文件(.pdf)和一个非常小的元数据文件导出到网络位置。目的是应该通过轮询.NET应用程序处理这两个文件,然后将其删除。

我的方法是

  1. 使用扩展程序' .part'
  2. 编写元数据文件
  3. 生成.pdf
  4. 将.part文件重命名为.dat
  5. .NET进程正在寻找扩展名为' .dat'的文件。只有,所以我希望两个读者/作者之间不会发生冲突。但是,.NET进程偶尔会记录以下错误...

    System.IO.IOException: The process cannot access the file '\\server\Path\FileName.dat' because it is being used by another process.

    (我偶尔说 - 我们正在测试,所以当数量增加时,这可能会成为一个问题)

    Delphi代码如下所示:

    AssignFile(FTextFile, Format('%s\%s.part', [DMSPath, FullFileName])); 
    try
      try
        ReWrite(FTextFile);
        Writeln(FTextFile, MetaDataString);
      finally  
        CloseFile(FTextFile);
      end;
    except
      raise ELogFileException.Create( LOGFILEWRITEFAILURE );
    end;
    

    然后有一个单独的方法执行以下代码行

    if FindFirst(Format('%s\*.part',[DMSPath]), faAnyFile, SearchRec) = 0 then begin
      repeat
        OldName := Format('%s\%s',[DMSPath, SearchRec.Name]);
        NewName := Format('%s\%s',[DMSPath, ChangeFileExt(SearchRec.Name, '.dat')]);
        RenameFile(OldName, NewName);
      until FindNext(SearchRec) <> 0;
      FindClose(SearchRec);
    end;
    

    我看不出这个代码本来就有任何错误,我们有几个补救措施,但我有两个问题

    1. 我应该尝试不同的技术来更可靠地保护&#39; .dat&#39;文件直到完全准备好
    2. 可能导致这种情况的原因是什么?

    3. 到目前为止,有一个建议的原因 - 防病毒软件。

      有关如何以不同方式生成文件的任何建议吗?请注意,我的应用程序是Delphi5;我想知道是否有更新,更原始的&#39; &#39; MoveFileA&#39;的版本我可以使用WinApi电话。

2 个答案:

答案 0 :(得分:0)

过去,我们遇到过像这样被锁定的问题。调查指出Windows&#39;预取。受影响的文件不在网络目录中。

据我所知,Prefetch仅适用于进程启动和/或启动时(由注册表项控制),因此它可能不适用于您当前的情况。

您可以查看&#34; C:\&#34; Windows&#34; \ Prefetch \&#34;目录。如果预取处于活动状态,则它应包含多个* .pf文件。如果有可执行文件名,那么可能值得研究。

答案 1 :(得分:0)

就个人而言,由于涉及多个文件,我会创建一个您先写的单独锁文件(例如,myfile.lck)。如果轮询应用程序在文件夹中看到它,则它将停止查找其他文件。一旦该文件消失,它就会深入了解。我不知道这是否可以解决您遇到的问题,但我会尝试一下。 (扩展名为.dat的文件经常由恶意恶意创建,因此它们可能会通过其他来源引发虚假问题,例如AV软件。其中包含0字节的锁定文件通常是无害的并且被忽视。)