DirCopy.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7. namespace HXX.Scanner.Common
  8. {
  9. public enum OverwriteStrategy
  10. {
  11. Skip, // 跳过已存在的文件
  12. Overwrite, // 强制覆盖
  13. Prompt // 询问用户
  14. }
  15. public class DirCopy
  16. {
  17. public static void CopyDirectory(string sourceDir, string targetDir, OverwriteStrategy strategy)
  18. {
  19. Directory.CreateDirectory(targetDir);
  20. foreach (string file in Directory.GetFiles(sourceDir))
  21. {
  22. string targetFile = Path.Combine(targetDir, Path.GetFileName(file));
  23. if (File.Exists(targetFile))
  24. {
  25. bool shouldOverwrite = false;
  26. switch (strategy)
  27. {
  28. case OverwriteStrategy.Skip:
  29. continue;
  30. case OverwriteStrategy.Overwrite:
  31. shouldOverwrite = true;
  32. break;
  33. case OverwriteStrategy.Prompt:
  34. Console.Write($"文件 {targetFile} 已存在,是否覆盖?(Y/N): ");
  35. shouldOverwrite = Console.ReadKey().Key == ConsoleKey.Y;
  36. Console.WriteLine();
  37. break;
  38. }
  39. if (shouldOverwrite)
  40. {
  41. // 处理文件锁定:尝试多次复制
  42. RetryCopy(file, targetFile, 3);
  43. }
  44. }
  45. else
  46. {
  47. File.Copy(file, targetFile);
  48. Console.WriteLine($"已拷贝文件: {targetFile}");
  49. }
  50. }
  51. foreach (string subDir in Directory.GetDirectories(sourceDir))
  52. {
  53. string targetSubDir = Path.Combine(targetDir, Path.GetFileName(subDir));
  54. CopyDirectory(subDir, targetSubDir, strategy);
  55. }
  56. }
  57. /// <summary>
  58. /// 带重试机制的文件复制(处理文件锁定)
  59. /// </summary>
  60. static void RetryCopy(string source, string target, int retryCount)
  61. {
  62. for (int i = 0; i < retryCount; i++)
  63. {
  64. try
  65. {
  66. File.Copy(source, target, true);
  67. Console.WriteLine($"已覆盖文件: {target}");
  68. return;
  69. }
  70. catch (IOException) when (i < retryCount - 1)
  71. {
  72. System.Threading.Thread.Sleep(1000); // 等待1秒后重试
  73. }
  74. }
  75. throw new IOException($"无法复制文件 {source}:目标文件被锁定");
  76. }
  77. }
  78. }