c# - File.Open 不会在 File.Move 时抛出 IOException

标签 c# ioexception

我在不同的服务器上遇到了 IOException 的奇怪问题。这是我的故事:

我有监控文件夹文件更改的 win 服务器 (C#)。此外,FTP 服务器 (WinSSHD) 指向同一文件夹。当有人上传文件时,WinService 检查写入是否完成。如果文件已上传,WinService 会通过 File.Move 方法重命名它。

写入完成检查是由 File.Open 方法进行的。像这样:

public static bool IsWriteComplete(string filePath)
{
    bool isWriteComplete;
    FileStream stream = null;
    try
    {
        stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite|FileShare.Delete);
        isWriteComplete = true;
    }
    catch (IOException)
    {
        isWriteComplete = false;
    }
    catch (Exception ex)
    {
        isWriteComplete = false;
    }
    finally
    {
        if (stream != null) { stream.Close(); }
    }
    return isWriteComplete;
}

由于某种原因,它在一台服务器上运行良好 (Win2003SP2),而在另一台服务器 (Win2003SP1) 上则根本无法运行。 IsWriteComplete 方法为 True,WinServer 稍后尝试移动文件并死于 IOException。我还没有找到关于此类问题的任何引用资料。

为了解决这个问题,我用 File.Move 替换了 File.Open。 之前:

stream = File.Open(filePath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite|FileShare.Delete);

之后:

File.Move(filePath, filePath);

现在它可以在第二台服务器 (Win2003SP1) 上运行,但无法在第一台服务器 (Win2003SP2) 上运行。

有人知道它为什么这样工作吗?

最佳答案

当您使用 File.Open 时,即使您使用 FileShare.None,您也会遇到“竞争条件” - 在您关闭文件后,另一个线程/进程可以在您调用 File 之前潜入并锁定文件(打开它) 。移动。这个其他进程可能不是 FTP 服务器,但可能是您甚至不知道的东西,例如病毒检查程序。因此,您应该使用 File.Move 而不是 File.Open,如果 File.Move 失败,则捕获 IOException,然后重试,直到成功。

关于c# - File.Open 不会在 File.Move 时抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156831/

相关文章:

c# - 对齐文本右 asp :changepassword

java - 为什么 Java 无法在我的 Ubuntu 桌面上创建此文件?

c# - 拆分包含空格的字符串,除非它们包含在 "quotes"中?

java - Android 蓝牙连接 - 服务发现失败

java - 为什么我应该使用用户代理访问 url?

java - Closeable 和 AutoCloseable close() 方法的执行顺序

java - Android Freebase 查询 IOException

c# - 一个类轮代码挑战

c# - 无法确定相关操作的有效顺序?

c# - ASP.NET 无法在同一类型变量中转换 session 变量