System.IO.IOException:当该文件已存在时无法创建该文件。即使在删除现有文件之后

Posted

技术标签:

【中文标题】System.IO.IOException:当该文件已存在时无法创建该文件。即使在删除现有文件之后【英文标题】:System.IO.IOException: Cannot create a file when that file already exists. Even after deleting the existing file 【发布时间】:2022-01-13 06:22:49 【问题描述】:

使用 .NET Core 3.1 和 C#,我试图将一个目录(包括所有子目录和文件)移动到另一个目录。目标目录可能包含与源目录同名的文件夹和文件,例如“source/folder/file.txt”可能已经存在于“destination/folder/file.txt”中,但我想覆盖目标目录中的所有内容。

我得到的错误是“System.IO.IOException:当该文件已经存在时无法创建文件。”,但是我在从源(File.io)移动文件之前删除目标中已经存在的文件。在 File.Move 之前删除),所以我不明白为什么会收到此错误。另外补充一点,由于某种原因,我无法 100% 地重现此错误。

这是我用来移动目录的代码(第 137 - 155 行):

        public static void MoveDirectory(string source, string target)
        
            var sourcePath = source.TrimEnd('\\', ' ');
            var targetPath = target.TrimEnd('\\', ' ');
            var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
                                 .GroupBy(s => Path.GetDirectoryName(s));
            foreach (var folder in files)
            
                var targetFolder = folder.Key.Replace(sourcePath, targetPath);
                Directory.CreateDirectory(targetFolder);
                foreach (var file in folder)
                
                    var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
                    if (File.Exists(targetFile)) File.Delete(targetFile);
                    File.Move(file, targetFile);
                
            
            Directory.Delete(source, true);
        

这是我的错误的堆栈跟踪:

Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException: Cannot create a file when that file already exists.
   at System.IO.FileSystem.MoveFile(String sourceFullPath, String destFullPath, Boolean overwrite)
   at Module_Installer.Classes.Bitbucket.MoveDirectory(String source, String target) in F:\git\module-installer\module-installer\Module Installer\Classes\Bitbucket.cs:line 147
   at Module_Installer.Classes.Bitbucket.DownloadModuleFiles(Module module, String username, String password, String workspace, String repository, String commitHash, String versionNumber, String downloadDirectory, String installDirectory) in F:\git\module-installer\module-installer\Module Installer\Classes\Bitbucket.cs:line 113
   at Module_Installer.Classes.OvernightInstall.ProcessInstalledModule(TenantModule tenantModule, Boolean skipBackup) in F:\git\module-installer\module-installer\Module Installer\Classes\OvernightInstall.cs:line 393
   at Module_Installer.Classes.OvernightInstall.Run(Boolean skipBackup) in F:\git\module-installer\module-installer\Module Installer\Classes\OvernightInstall.cs:line 75
   at Module_Installer.Program.Main(String[] args) in F:\git\module-installer\module-installer\Module Installer\Program.cs:line 40

当我通过 Windows 任务计划程序运行应用程序时发生此错误,我已将其设置为每天凌晨 03:30 运行,我已指定任务应“启动”与 EXE 所在的文件夹相同位于。

任何建议将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

不要删除目标目录中的现有文件,而是尝试使用File.Move(file, targetFile, overwrite: true) 覆盖它们。

顺便说一句,MSDN example 介绍了如何复制目录。这不完全是您的用例,但无论如何可能会有所帮助。

【讨论】:

感谢您的帮助,这几乎肯定会解决它,不知道为什么我没有意识到 File.Move 方法中有一个覆盖参数。

以上是关于System.IO.IOException:当该文件已存在时无法创建该文件。即使在删除现有文件之后的主要内容,如果未能解决你的问题,请参考以下文章

System.IO.IOException:共享路径冲突

从 Git 本地部署到 Azure System.IO.IOException: 磁盘空间不足

System.IO.IOException:当该文件已存在时无法创建该文件。即使在删除现有文件之后

ZipFile.CreateFromDirectory 抛出 System.IO.IOException :该进程无法访问文件 X,因为它正在被另一个进程使用

fiddler手机抓包遇到的问题-SecureClientPipeDirect failed: System.IO.IOException

在没有ToList()的情况下运行时,在Linq的SelectMany()中读取文件会抛出System.IO.IOException