我在Windows Server 2008 R2 Standard Edition上运行Windows服务。它是一个.NET 4.0应用程序,它处理二进制文件并将处理过的文件移动到同一卷上的不同文件夹中。文件系统是NTFS。问题在于以下代码:
try
{
if (File.Exists(srcFileName))
{
File.Move(srcFileName, dstFileName);
}
}
catch (Exception ex)
{
log.Error("Failed to move file.", ex);
}
路径srcFileName
和dstFileName
具有以下形式:D:\src_dir\fileX.bin
和D:\dst_dir\fileX.bin
。 log
是log4net logger对象。读取文件以便使用File.ReadAllBytes(srcFileName)
进行处理。
问题是尽管代码大部分时间都按预期工作,但偶尔会复制一些文件而不是移动到目标文件夹,并且日志中没有记录错误。查看日志似乎一切正常,但有些文件出现在源文件夹和目标文件夹中。似乎问题与服务器负载有关,因为当RAM使用量超过30 GB(从可用的32 GB)并且平均磁盘队列超过2时,似乎会发生这种情况。
我很感激任何可能导致这种行为的想法,特别是当移动失败时没有异常。有没有办法确保移动操作成功完成?
答案 0 :(得分:0)
另外,似乎删除操作失败。
有两种方法可以“移动”文件:实际上移动目录信息,并且 - 禁止这样做 - 将其复制到目的地,然后删除目标。在您描述的实例中,使用选项(2)并且删除尝试因任何原因而失败。也许该文件是由另一个进程或应用程序对I / O打开的(在UNIX上不是问题:在i-node处于活动状态时删除目录条目是可以的,因为当前的读者/编写者一旦有了它就不需要目录条目获得了有效的文件描述符)。