DirectoryUtilsTest.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. namespace MeloongCore.Tests;
  2. public class DirectoryUtilsTest : TestWithFolder {
  3. [Test]
  4. [Arguments(false)]
  5. [Arguments(true)]
  6. public async Task 土耳其语_目录同源及仅改大小写保留内容(bool copy) {
  7. var originalCulture = System.Globalization.CultureInfo.CurrentCulture;
  8. string root = tempFolder;
  9. string source = Path.Combine(root, "FILES");
  10. string destination = Path.Combine(root, "files");
  11. try {
  12. System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("tr-TR");
  13. DirectoryUtils.Create(source);
  14. FileUtils.Write(Path.Combine(source, "keep.txt"), "目录内容");
  15. if (copy) {
  16. DirectoryUtils.Copy(source, source);
  17. DirectoryUtils.Copy(source, destination);
  18. } else {
  19. DirectoryUtils.Move(source, source);
  20. DirectoryUtils.Move(source, destination);
  21. }
  22. await Assert.That(FileUtils.ReadAsString(Path.Combine(destination, "keep.txt"))).IsEqualTo("目录内容");
  23. await Assert.That(Directory.GetDirectories(PathUtils.ForApi(root)).Select(Path.GetFileName).Single()).IsEqualTo("files");
  24. } finally {
  25. System.Globalization.CultureInfo.CurrentCulture = originalCulture;
  26. DirectoryUtils.Delete(root);
  27. }
  28. }
  29. #region 剪切、复制
  30. [Test]
  31. [Arguments("Source", "目标文件夹")]
  32. [Arguments("Source", "Source")]
  33. [Arguments("Source", "soURCE")]
  34. public async Task 复制(string sourceName, string destName) {
  35. var src = Path.Combine(tempFolder, sourceName);
  36. DirectoryUtils.Create(Path.Combine(src, "sub"));
  37. FileUtils.Write(Path.Combine(src, "a.txt"), "aaa");
  38. FileUtils.Write(Path.Combine(src, "sub", "b file.txt"), "bbb");
  39. var dest = Path.Combine(tempFolder, destName);
  40. DirectoryUtils.Copy(src, dest);
  41. await Assert.That(FileUtils.ReadAsString(Path.Combine(src, "a.txt"))).IsEqualTo("aaa");
  42. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "a.txt"))).IsEqualTo("aaa");
  43. await Assert.That(FileUtils.ReadAsString(Path.Combine(src, "sub", "b file.txt"))).IsEqualTo("bbb");
  44. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "sub", "b file.txt"))).IsEqualTo("bbb");
  45. await Assert.That(DirectoryUtils.EnumerateDirectories(tempFolder, true)).Contains(dest); // 目标文件夹名
  46. }
  47. [Test]
  48. [Arguments("Source", "目标文件夹")]
  49. [Arguments("Source", "Source")]
  50. [Arguments("Source", "soURCE")]
  51. public async Task 剪切(string sourceName, string destName) {
  52. var src = Path.Combine(tempFolder, sourceName);
  53. DirectoryUtils.Create(Path.Combine(src, "sub"));
  54. FileUtils.Write(Path.Combine(src, "a.txt"), "aaa");
  55. FileUtils.Write(Path.Combine(src, "sub", "b file.txt"), "bbb");
  56. var dest = Path.Combine(tempFolder, destName);
  57. DirectoryUtils.Move(src, dest);
  58. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "a.txt"))).IsEqualTo("aaa");
  59. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "sub", "b file.txt"))).IsEqualTo("bbb");
  60. if (src != dest) await Assert.That(DirectoryUtils.EnumerateDirectories(tempFolder, true)).DoesNotContain(src);
  61. await Assert.That(DirectoryUtils.EnumerateDirectories(tempFolder, true)).Contains(dest); // 目标文件夹名
  62. }
  63. [Test]
  64. public async Task 剪切_不同磁盘() {
  65. // 寻找两个磁盘
  66. var drives = DriveInfo.GetDrives()
  67. .Where(d => d.IsReady && d.DriveType == DriveType.Fixed)
  68. .ToArray();
  69. if (drives.Length < 2) return;
  70. var id = Guid.NewGuid().ToString("N");
  71. var srcRoot = Path.Combine(drives[0].RootDirectory.FullName, "Temp", $"MeloongTest_{id}");
  72. var destRoot = Path.Combine(drives[1].RootDirectory.FullName, "Temp", $"MeloongTest_{id}");
  73. var src = Path.Combine(srcRoot, "src");
  74. var dest = Path.Combine(destRoot, "dest");
  75. try {
  76. DirectoryUtils.Create(src);
  77. FileUtils.Write(Path.Combine(src, "a.txt"), "aaa");
  78. FileUtils.Write(Path.Combine(src, "sub", "b file.txt"), "bbb");
  79. DirectoryUtils.Move(src, dest);
  80. await Assert.That(DirectoryUtils.Exists(src)).IsFalse();
  81. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "a.txt"))).IsEqualTo("aaa");
  82. await Assert.That(FileUtils.ReadAsString(Path.Combine(dest, "sub", "b file.txt"))).IsEqualTo("bbb");
  83. } finally {
  84. DirectoryUtils.Delete(srcRoot);
  85. DirectoryUtils.Delete(destRoot);
  86. }
  87. }
  88. [Test]
  89. public void 剪切_安全检查()
  90. => Assert.Throws<UnauthorizedAccessException>(() => DirectoryUtils.Move(Paths.Base, Path.Combine(tempFolder, "SafetyCheckDest")));
  91. [Test]
  92. public async Task 删除_安全检查_允许程序目录下的子文件夹() {
  93. var folder = Path.Combine(Paths.Base, $"MeloongTest_{Guid.NewGuid():N}");
  94. try {
  95. DirectoryUtils.Create(folder);
  96. DirectoryUtils.Delete(folder);
  97. await Assert.That(DirectoryUtils.Exists(folder)).IsFalse();
  98. } finally {
  99. if (Directory.Exists(PathUtils.ForApi(folder))) Directory.Delete(PathUtils.ForApi(folder), true);
  100. }
  101. }
  102. #endregion
  103. }