File.Move() 操作无法从原始文件夹中删除文件而没有错误

Posted

技术标签:

【中文标题】File.Move() 操作无法从原始文件夹中删除文件而没有错误【英文标题】:File.Move() operation fails to remove file from original folder without error 【发布时间】:2016-08-16 14:28:36 【问题描述】:

我有一个在 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.binlog 是 log4net 记录器对象。使用File.ReadAllBytes(srcFileName) 读取文件以进行处理。

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

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

【问题讨论】:

总是相同的文件夹和相同的用户还是特定用户或文件夹的问题? @Jonny 始终是同一个用户和同一个两个文件夹。该服务正在本地系统帐户下运行。 【参考方案1】:

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

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

【讨论】:

如果我对File.Move()的理解正确,在同一卷中使用时不应执行复制+删除。如果操作无法成功完成,我希望抛出异常。

以上是关于File.Move() 操作无法从原始文件夹中删除文件而没有错误的主要内容,如果未能解决你的问题,请参考以下文章

如何实现异步 File.Delete/Create/Move?

File.Exists + File.Move 错误“该进程无法访问该文件,因为它正被另一个进程使用。”

步步为营-14-文件操作

File.Move 不从目标目录继承权限?

File类

File.Move 不适用于 UNC 路径