【发布时间】:2014-09-22 15:35:25
【问题描述】:
我有一个 Delphi5 应用程序,它将文件 (.pdf) 和一个非常小的元数据文件导出到网络位置。目的是轮询 .NET 应用程序应处理这两个文件,然后将其删除。
我的方法是
- 使用扩展名“.part”编写元数据文件
- 生成 .pdf
- 将 .part 文件重命名为 .dat
.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;
我看不出这段代码有什么本质上的错误,我们有一些补救措施,但我有 2 个问题
- 我是否应该尝试一种不同的技术来更可靠地保护“.dat”文件直到它完全准备好
- 什么情况会导致这种情况?
到目前为止,有一个建议的原因 - 防病毒软件。
关于如何以不同方式生成文件有什么建议吗?注意我的应用是Delphi5;我想知道是否有我可以使用的“MoveFileA”WinApi 调用的更新、更“原子”版本。
【问题讨论】:
-
常见原因是您的 AV 软件
-
谢谢,@David - 我没想到
-
Windows Search 曾经导致这个问题,虽然我最近没有看到它,所以它现在可能已修复。如果这是原因,您可以通过在您创建的文件上设置“不索引”属性来解决它。
-
When in doubt, run Process Monitor。说真的:运行 procmon,设置一些过滤,等待异常发生并查看其他进程正在使用您的
.dat文件。 -
@Lieven - 很好的提示,谢谢。
标签: delphi winapi file-io delphi-5