【问题标题】:System.IO.File.Move gives Exception "The file exists"System.IO.File.Move 给出异常“文件存在”
【发布时间】:2013-09-06 14:04:12
【问题描述】:

通常,如果您尝试移动到已存在的文件,File.Move 会抛出消息“当该文件已存在时无法创建文件”。

我遇到了 File.Move 抛出的情况

“文件存在”

这个异常是System.IO.__Error.WinIOError在做File.Move之后直接抛出的

它正在尝试将文件移动到网络驱动器。

经过一番搜索,唯一给出此特定消息的其他内容似乎是 Path.GetTempFileName() - 如果临时文件夹已满,则可能会抛出此消息。

我没有使用GetTempFileName,并且临时文件夹未满。

有谁知道这可能是什么原因,或者如何排除故障? (这是在托管服务器上,只有管理公司可以访问,这里我不能显示专有代码)。

【问题讨论】:

  • 如果你不给我们完整的异常和堆栈跟踪,很难说问题出在哪里。
  • 我会试着澄清我的问题。这不是一个“发现代码错误”的问题,而是 File.Move 在什么情况下通常会抛出“文件存在”?

标签: .net exception


【解决方案1】:

这来自 Windows,针对不同场景的不同错误代码。第二个是ERROR_ALREADY_EXISTS,当文件从一个目录移动到同一驱动器上的另一个时,“当该文件已存在时无法创建文件”。这是一个非常简单的操作,只需要移动目录条目。

第一个是 ERROR_FILE_EXISTS,当文件从一个驱动器移动到另一个驱动器时,“文件存在”。这是一个更复杂的操作,文件数据也必须被复制。换句话说,它回退到 File.Copy(string, string, bool) 的等价物,最后一个 overwrite 参数设置为 false。它不使用相同的错误代码有点怪癖。不同之处在于文件系统驱动程序,而不是您的程序。否则,您只会得到一个非常通用的 IOException 而不是更具体的将文件操作事故分解为更细粒度的异常的原因。

这实际上不是问题,因为您在代码中对此无能为力,您需要人工帮助来解决问题。除非您在自己的代码中采取特定的先发制人措施,否则如果目标文件已经存在则避免移动,或者首先实际删除目标文件。请注意,这两者都不是 100% 可靠的解决方法,在您删除文件之后但在您移动之前,另一个进程再次创建文件的可能性很小。在多任务操作系统上使文件操作完全可靠是相当困难的。

【讨论】:

  • 谢谢汉斯,你的回答听起来很接近。这是向网络驱动器的转移(已编辑问题)。我搜索了类似的文档,但没有找到。你有参考吗?
  • 参考什么?我刚刚创建了一个 afaik。
  • 我刚刚通过创建一个尝试将文件移动到文件已经存在的网络驱动器的控制台应用程序来确认这一点。
【解决方案2】:

我相信你必须指定文件名,当然假设你不是。它有助于显示您的代码,但我会做出您正在做的假设:

File.Move(@"C:\Folder\File.txt", @"C:\Folder2")

请尝试:

File.Move(@"C:\Folder\File.txt", @"C:\Folder2\File.txt")

【讨论】:

  • 您需要转义斜杠或使用逐字字符串。也就是说,"C:\\Folder\\File.txt"@"C:\Folder\File.txt"
  • 另外,仅给出目录名会引发与指定存在的文件名相同的异常。
  • 对,说的有点心不在焉。但我不确定这一点,因为他说他遇到了两个不同的错误,一个是他把它放在文件存在的地方,但我不知道他是怎么做到的。坦率地说,这在很大程度上是一个猜测,因为我不知道他的代码是什么或错误可能在哪里
【解决方案3】:

使用 .NET Core 3.0 或更高版本,Move 方法有一个新的布尔参数,用于将覆盖设置为 true,如果文件存在,它将替换文件。

Move(String, String, Boolean)

您可以找到更多关于此的here

【讨论】:

    【解决方案4】:

    还有另一种方法可以做到这一点:

    public void Move(string uncPath)
            {
                var files = Directory.EnumerateFiles(Constants.ROOT_PATH, "*.csv");
    
                foreach (var file in files)
                {
                    var item = file.GetAfter("\\");
                    File.Copy(file, uncPath + item);
                    File.Delete(file);
                }
            }
    

    我已经对此进行了测试,它的工作原理就像一个魅力。希望它可以帮助某人

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2022-01-21
      • 2013-01-23
      • 1970-01-01
      • 2023-02-23
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多