我有一个Delphi5应用程序,它将文件(.pdf)和一个非常小的元数据文件导出到网络位置。目的是应该通过轮询.NET应用程序处理这两个文件,然后将其删除。
我的方法是
.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;
我看不出这个代码本来就有任何错误,我们有几个补救措施,但我有两个问题
到目前为止,有一个建议的原因 - 防病毒软件。
有关如何以不同方式生成文件的任何建议吗?请注意,我的应用程序是Delphi5;我想知道是否有更新,更原始的&#39; &#39; MoveFileA&#39;的版本我可以使用WinApi电话。
答案 0 :(得分:0)
过去,我们遇到过像这样被锁定的问题。调查指出Windows&#39;预取。受影响的文件不在网络目录中。
据我所知,Prefetch仅适用于进程启动和/或启动时(由注册表项控制),因此它可能不适用于您当前的情况。
您可以查看&#34; C:\&#34; Windows&#34; \ Prefetch \&#34;目录。如果预取处于活动状态,则它应包含多个* .pf文件。如果有可执行文件名,那么可能值得研究。
答案 1 :(得分:0)
就个人而言,由于涉及多个文件,我会创建一个您先写的单独锁文件(例如,myfile.lck)。如果轮询应用程序在文件夹中看到它,则它将停止查找其他文件。一旦该文件消失,它就会深入了解。我不知道这是否可以解决您遇到的问题,但我会尝试一下。 (扩展名为.dat的文件经常由恶意恶意创建,因此它们可能会通过其他来源引发虚假问题,例如AV软件。其中包含0字节的锁定文件通常是无害的并且被忽视。)