System.IO.IOException: 当文件已经存在时无法创建文件。即使在删除现有文件之后
System.IO.IOException: Cannot create a file when that file already exists. Even after deleting the existing file
我正在尝试使用 .NET Core 3.1 和 C# 将一个目录(包括所有子目录和文件)移动到另一个目录。目标目录可能包含与源目录同名的文件夹和文件,例如“source/folder/file.txt”可能已经存在于“destination/folder/file.txt”但我想覆盖目标目录中的所有内容。
我得到的错误是“System.IO.IOException:当该文件已经存在时无法创建文件。”,但是我在从源移动文件之前删除了目标中已经存在的文件( File.Delete 在 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 Task Scheduler 运行 应用程序时发生此错误,我已将其设置为每天 03:30am 运行,我有指定任务应“开始于”与 EXE 所在文件夹相同的文件夹。
如有任何建议,我们将不胜感激!
不要删除目标目录中的现有文件,而是尝试使用 File.Move(file, targetFile, overwrite: true)
覆盖它们。
顺便说一句,MSDN example 介绍了如何复制目录。这不完全是您的用例,但无论如何都会有所帮助。
我正在尝试使用 .NET Core 3.1 和 C# 将一个目录(包括所有子目录和文件)移动到另一个目录。目标目录可能包含与源目录同名的文件夹和文件,例如“source/folder/file.txt”可能已经存在于“destination/folder/file.txt”但我想覆盖目标目录中的所有内容。
我得到的错误是“System.IO.IOException:当该文件已经存在时无法创建文件。”,但是我在从源移动文件之前删除了目标中已经存在的文件( File.Delete 在 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 Task Scheduler 运行 应用程序时发生此错误,我已将其设置为每天 03:30am 运行,我有指定任务应“开始于”与 EXE 所在文件夹相同的文件夹。
如有任何建议,我们将不胜感激!
不要删除目标目录中的现有文件,而是尝试使用 File.Move(file, targetFile, overwrite: true)
覆盖它们。
顺便说一句,MSDN example 介绍了如何复制目录。这不完全是您的用例,但无论如何都会有所帮助。