1

我有一个在 Windows Server 2008 R2 标准版上运行的 Windows 服务。这是一个 .NET 4.0 应用程序,它处理二进制文件并将处理后的文件移动到同一卷上的不同文件夹中。文件系统为 NTFS。问题在于以下代码:

try
{
    if (File.Exists(srcFileName))
    {
        File.Move(srcFileName, dstFileName);
    }
}
catch (Exception ex)
{
    log.Error("Failed to move file.", ex);
}

路径srcFileNamedstFileName具有以下形式:D:\src_dir\fileX.binD:\dst_dir\fileX.bin。是loglog4net 记录器对象。读取文件以进行处理File.ReadAllBytes(srcFileName)

问题是,虽然代码大部分时间都按预期工作,但偶尔会复制一些文件而不是移动到目标文件夹,并且日志中没有记录错误。查看日志,似乎一切正常,但有些文件同时出现在源文件夹和目标文件夹中。该问题似乎与服务器负载有关,因为它似乎发生在 RAM 使用量超过 30 GB(从可用的 32 GB)并且平均磁盘队列超过 2 时。

我会很感激可能导致这种行为的任何想法,尤其是在移动失败时没有异常。有没有办法确保移动操作成功完成?

4

1 回答 1

0

顺便说一句,删除操作似乎失败了。

有两种方法可以“移动”文件:实际移动目录信息,以及——除非有可能——将其复制到目标位置,然后删除目标。在您描述的情况下,使用了选项 (2),并且无论出于何种原因,删除尝试都失败了。也许该文件已被另一个进程或应用程序打开以进行 I/O(在 UNIX 上不是问题:在 i-node 处于活动状态时删除目录条目是可以的,因为当前的读取器/写入器一旦拥有目录条目就不需要获得了一个有效的文件描述符)。

于 2016-08-16T15:15:58.480 回答