| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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);
- }
- }
- /// <summary>
- /// 带重试机制的文件复制(处理文件锁定)
- /// </summary>
- 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}:目标文件被锁定");
- }
- }
- }
|