gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:02:59 25 4
gpt4 key购买 nike

我在不同的服务器上遇到了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com