7

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

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

“文件存在”

System.IO.__Error.WinIOError执行后直接抛出此异常File.Move

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

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

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

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

4

4 回答 4

4

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

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

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

于 2013-09-06T16:04:19.817 回答
2

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

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

相反,请尝试:

File.Move(@"C:\Folder\File.txt", @"C:\Folder2\File.txt")
于 2013-09-06T14:09:08.427 回答
2

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

Move(String, String, Boolean)

你可以在这里找到更多关于它的信息。

于 2021-01-03T11:01:09.170 回答
1

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

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);
            }
        }

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

于 2019-07-10T08:03:59.843 回答