using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace HXX.Scanner.Copier { enum OverwriteStrategy { Skip, // 跳过已存在的文件 Overwrite, // 强制覆盖 Prompt // 询问用户 } class DirCopy2 { public static void CopyDirectory(string sourceDir, string targetDir, OverwriteStrategy strategy) { Directory.CreateDirectory(targetDir); foreach (string file in Directory.GetFiles(sourceDir)) { string targetFile = Path.Combine(targetDir, Path.GetFileName(file)); if (File.Exists(targetFile)) { bool shouldOverwrite = false; switch (strategy) { case OverwriteStrategy.Skip: continue; case OverwriteStrategy.Overwrite: shouldOverwrite = true; break; case OverwriteStrategy.Prompt: Console.Write($"文件 {targetFile} 已存在,是否覆盖?(Y/N): "); shouldOverwrite = Console.ReadKey().Key == ConsoleKey.Y; Console.WriteLine(); break; } if (shouldOverwrite) { // 处理文件锁定:尝试多次复制 RetryCopy(file, targetFile, 3); } } else { File.Copy(file, targetFile); Console.WriteLine($"已拷贝文件: {targetFile}"); } } foreach (string subDir in Directory.GetDirectories(sourceDir)) { string targetSubDir = Path.Combine(targetDir, Path.GetFileName(subDir)); CopyDirectory(subDir, targetSubDir, strategy); } } /// /// 带重试机制的文件复制(处理文件锁定) /// static void RetryCopy(string source, string target, int retryCount) { for (int i = 0; i < retryCount; i++) { try { File.Copy(source, target, true); Console.WriteLine($"已覆盖文件: {target}"); return; } catch (IOException) when (i < retryCount - 1) { System.Threading.Thread.Sleep(1000); // 等待1秒后重试 } } throw new IOException($"无法复制文件 {source}:目标文件被锁定"); } } }