CopyTo-Erweiterung für DirectoryInfo

    • VB.NET

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Artentus.

      CopyTo-Erweiterung für DirectoryInfo

      Aufgrund einer Diskussion, ob nun My.Computer.FileSystem oder System.IO besser sei, die kürzlich stattfand (einige haben sie vielleicht mitbekommen), und weil ich ein Verfechter von System.IO bin, war ich überrascht, dass es tatsächlich etwas gibt, bei dem My.Computer.FileSystem besser ist. Es handelt sich dabei um das Kopieren von Verzeichnissen.
      Das konnte ich natürlich nicht auf mir sitzen lassen, und deshalb habe mich daran gemacht eine Extension für DirectoryInfo zu schreiben, die die My.Computer.FileSystem.CopyDirectory-Methode schlagen kann. Und das ist dabei herausgekommen:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Module DirectoryInfoExtensions
      2. ''' <summary>
      3. ''' Kopiert das Verzeichnis an den angegebenen Ort.
      4. ''' </summary>
      5. ''' <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses kopiert werden soll.</param>
      6. ''' <param name="merge">Gibt an, ob beim Vorhandensein des Zielverzeichnisses fortgefahren werden soll.</param>
      7. ''' <param name="options">Gibt an, wie verfahren werden soll, wenn Dateien aus dem Ausgangsverzeichnis im Zielverzeichnis bereits vorhanden sind.</param>
      8. ''' <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      9. ''' <exception cref="System.IO.IOException">Tritt auf, wenn "merge" false ist und der Zielordner bereits existiert, oder wenn OverwriteOptions.ThrowError übergeben wurde und eine zu kopierende Datei am Zielort bereits existiert.</exception>
      10. <Extension>
      11. Public Function CopyTo(dir As DirectoryInfo, destDirName As String, merge As Boolean, options As OverwriteOptions) As DirectoryInfo
      12. Dim result = New DirectoryInfo(destDirName)
      13. If result.Exists Then
      14. If Not merge Then Throw New IOException("Der Ordner """ & Convert.ToString(result.FullName) & """ existiert bereits.")
      15. Else
      16. result.Create()
      17. End If
      18. For Each d In dir.EnumerateDirectories()
      19. d.CopyTo(Path.Combine(destDirName, d.Name), merge, options)
      20. Next
      21. For Each f In dir.EnumerateFiles()
      22. Dim newPath = Path.Combine(result.FullName, f.Name)
      23. Select Case options
      24. Case OverwriteOptions.None
      25. If File.Exists(newPath) Then Throw New IOException("Die Datei """ & Convert.ToString(newPath) & """ existiert bereits.")
      26. f.CopyTo(newPath)
      27. Case OverwriteOptions.DontOverwrite
      28. If Not File.Exists(newPath) Then f.CopyTo(newPath)
      29. Case OverwriteOptions.OverwriteAll
      30. f.CopyTo(newPath, True)
      31. Case OverwriteOptions.OverwriteWhenNewer
      32. Dim newF = New FileInfo(newPath)
      33. If Not newF.Exists OrElse newF.LastWriteTime > f.LastWriteTime Then
      34. f.CopyTo(newPath, True)
      35. End If
      36. Case OverwriteOptions.Rename
      37. Dim count = 1
      38. While File.Exists(newPath)
      39. count += 1
      40. newPath = Path.Combine(result.FullName, String.Concat(Path.GetFileNameWithoutExtension(f.Name), " (", count, ")", f.Extension))
      41. End While
      42. f.CopyTo(newPath)
      43. End Select
      44. Next
      45. Return result
      46. End Function
      47. ''' <summary>
      48. ''' Kopiert das Verzeichnis an den angegebenen Ort.
      49. ''' </summary>
      50. ''' <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses kopiert werden soll.</param>
      51. ''' <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      52. ''' <exception cref="System.IO.IOException">Tritt auf, wenn der Zielordner bereits existiert, oder wenn eine zu kopierende Datei am Zielort bereits existiert.</exception>
      53. <Extension>
      54. Public Function CopyTo(dir As DirectoryInfo, destDirName As String) As DirectoryInfo
      55. Return dir.CopyTo(destDirName, False, OverwriteOptions.None)
      56. End Function
      57. ''' <summary>
      58. ''' Verschiebt das Verzeichnis an den angegebenen Ort.
      59. ''' </summary>
      60. ''' <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses verschoben werden soll.</param>
      61. ''' <param name="merge">Gibt an, ob beim Vorhandensein des Zielverzeichnisses fortgefahren werden soll.</param>
      62. ''' <param name="options">Gibt an, wie verfahren werden soll, wenn Dateien aus dem Ausgangsverzeichnis im Zielverzeichnis bereits vorhanden sind.</param>
      63. ''' <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      64. ''' <exception cref="System.IO.IOException">Tritt auf, wenn "merge" false ist und der Zielordner bereits existiert, oder wenn OverwriteOptions.None übergeben wurde und eine zu kopierende Datei am Zielort bereits existiert.</exception>
      65. <Extension>
      66. Public Function MoveTo(dir As DirectoryInfo, destDirName As String, merge As Boolean, options As OverwriteOptions) As DirectoryInfo
      67. Dim result = New DirectoryInfo(destDirName)
      68. If result.Exists Then
      69. If Not merge Then
      70. Throw New IOException("Der Ordner """ & Convert.ToString(result.FullName) & """ existiert bereits.")
      71. End If
      72. Else
      73. result.Create()
      74. End If
      75. For Each d In dir.EnumerateDirectories()
      76. d.MoveTo(Path.Combine(destDirName, d.Name), merge, options)
      77. Next
      78. For Each f In dir.EnumerateFiles()
      79. Dim newPath = Path.Combine(result.FullName, f.Name)
      80. Select Case options
      81. Case OverwriteOptions.None
      82. If File.Exists(newPath) Then Throw New IOException("Die Datei """ & Convert.ToString(newPath) & """ existiert bereits.")
      83. f.MoveTo(newPath)
      84. Case OverwriteOptions.DontOverwrite
      85. If Not File.Exists(newPath) Then f.MoveTo(newPath)
      86. Case OverwriteOptions.OverwriteAll
      87. Dim newF1 = New FileInfo(newPath)
      88. If newF1.Exists Then newF1.Delete()
      89. f.MoveTo(newPath)
      90. Case OverwriteOptions.OverwriteWhenNewer
      91. Dim newF2 = New FileInfo(newPath)
      92. If newF2.Exists Then
      93. If newF2.LastWriteTime > f.LastWriteTime Then
      94. newF2.Delete()
      95. f.MoveTo(newPath)
      96. End If
      97. Else
      98. f.MoveTo(newPath)
      99. End If
      100. Case OverwriteOptions.Rename
      101. Dim count = 1
      102. While File.Exists(newPath)
      103. count += 1
      104. newPath = Path.Combine(result.FullName, String.Concat(Path.GetFileNameWithoutExtension(f.Name), " (", count, ")", f.Extension))
      105. End While
      106. f.MoveTo(newPath)
      107. End Select
      108. Next
      109. dir.Delete()
      110. Return result
      111. End Function
      112. End Module
      113. ''' <summary>
      114. ''' Gibt an, wie bei einem Kopiervorgang verfahren werden soll, wenn die Zieldatei bereits existiert.
      115. ''' </summary>
      116. Public Enum OverwriteOptions
      117. ''' <summary>
      118. ''' Wenn die Datei bereits existiert, wird ein Fehler ausgelöst.
      119. ''' </summary>
      120. ThrowError
      121. ''' <summary>
      122. ''' Dateien werden nie überschrieben.
      123. ''' </summary>
      124. DontOverwrite
      125. ''' <summary>
      126. ''' Dateien werden immer überschrieben.
      127. ''' </summary>
      128. OverwriteAll
      129. ''' <summary>
      130. ''' Dateien werden nur überschrieben, wenn sie älter sind als die neue Datei.
      131. ''' </summary>
      132. OverwriteWhenNewer
      133. ''' <summary>
      134. ''' Neue Dateien werden umbenannt, wenn die Zieldatei existiert.
      135. ''' </summary>
      136. Rename
      137. End Enum

      Ich habe alles in den XML-Kommentaren erklärt, weshalb ich das hier nun nicht mehr tun werde.
      Zusätzlich zu CopyTo ist auch eine verbesserte MoveTo-Funktion dabei.
      Den entsprechenden C#-Code werde ich (aufgrund von Platzmangel) noch nachreichen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

      Hier jetzt auch noch der C#-Code:
      Spoiler anzeigen

      C-Quellcode

      1. public static class DirectoryInfoExtensions
      2. {
      3. /// <summary>
      4. /// Kopiert das Verzeichnis an den angegebenen Ort.
      5. /// </summary>
      6. /// <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses kopiert werden soll.</param>
      7. /// <param name="merge">Gibt an, ob beim Vorhandensein des Zielverzeichnisses fortgefahren werden soll.</param>
      8. /// <param name="options">Gibt an, wie verfahren werden soll, wenn Dateien aus dem Ausgangsverzeichnis im Zielverzeichnis bereits vorhanden sind.</param>
      9. /// <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      10. /// <exception cref="System.IO.IOException">Tritt auf, wenn "merge" false ist und der Zielordner bereits existiert, oder wenn OverwriteOptions.ThrowError übergeben wurde und eine zu kopierende Datei am Zielort bereits existiert.</exception>
      11. public static DirectoryInfo CopyTo(this DirectoryInfo dir, string destDirName, bool merge, OverwriteOptions options)
      12. {
      13. var result = new DirectoryInfo(destDirName);
      14. if (result.Exists)
      15. {
      16. if (!merge)
      17. throw new IOException("Der Ordner \"" + result.FullName + "\" existiert bereits.");
      18. }
      19. else
      20. result.Create();
      21. foreach (var d in dir.EnumerateDirectories())
      22. {
      23. d.CopyTo(Path.Combine(destDirName, d.Name), merge, options);
      24. }
      25. foreach (var f in dir.EnumerateFiles())
      26. {
      27. var newPath = Path.Combine(result.FullName, f.Name);
      28. switch (options)
      29. {
      30. case OverwriteOptions.None:
      31. if (File.Exists(newPath))
      32. throw new IOException("Die Datei \"" + newPath + "\" existiert bereits.");
      33. f.CopyTo(newPath);
      34. break;
      35. case OverwriteOptions.DontOverwrite:
      36. if (!File.Exists(newPath))
      37. f.CopyTo(newPath);
      38. break;
      39. case OverwriteOptions.OverwriteAll:
      40. f.CopyTo(newPath, true);
      41. break;
      42. case OverwriteOptions.OverwriteWhenNewer:
      43. var newF = new FileInfo(newPath);
      44. if (!newF.Exists || newF.LastWriteTime > f.LastWriteTime)
      45. f.CopyTo(newPath, true);
      46. break;
      47. case OverwriteOptions.Rename:
      48. var count = 1;
      49. while (File.Exists(newPath))
      50. {
      51. count++;
      52. newPath = Path.Combine(result.FullName, string.Concat(Path.GetFileNameWithoutExtension(f.Name), " (", count, ")", f.Extension));
      53. }
      54. f.CopyTo(newPath);
      55. break;
      56. }
      57. }
      58. return result;
      59. }
      60. /// <summary>
      61. /// Kopiert das Verzeichnis an den angegebenen Ort.
      62. /// </summary>
      63. /// <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses kopiert werden soll.</param>
      64. /// <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      65. /// <exception cref="System.IO.IOException">Tritt auf, wenn der Zielordner bereits existiert, oder wenn eine zu kopierende Datei am Zielort bereits existiert.</exception>
      66. public static DirectoryInfo CopyTo(this DirectoryInfo dir, string destDirName)
      67. {
      68. return dir.CopyTo(destDirName, false, OverwriteOptions.None);
      69. }
      70. /// <summary>
      71. /// Verschiebt das Verzeichnis an den angegebenen Ort.
      72. /// </summary>
      73. /// <param name="destDirName">Name und Pfad des Verzeichnisses, in das der Inhalt dieses Verzeichnisses verschoben werden soll.</param>
      74. /// <param name="merge">Gibt an, ob beim Vorhandensein des Zielverzeichnisses fortgefahren werden soll.</param>
      75. /// <param name="options">Gibt an, wie verfahren werden soll, wenn Dateien aus dem Ausgangsverzeichnis im Zielverzeichnis bereits vorhanden sind.</param>
      76. /// <returns>Ein neues DirectoryInfo-Objekt, das das Zielverzeichnis darstellt.</returns>
      77. /// <exception cref="System.IO.IOException">Tritt auf, wenn "merge" false ist und der Zielordner bereits existiert, oder wenn OverwriteOptions.None übergeben wurde und eine zu kopierende Datei am Zielort bereits existiert.</exception>
      78. public static DirectoryInfo MoveTo(this DirectoryInfo dir, string destDirName, bool merge, OverwriteOptions options)
      79. {
      80. var result = new DirectoryInfo(destDirName);
      81. if (result.Exists)
      82. {
      83. if (!merge)
      84. throw new IOException("Der Ordner \"" + result.FullName + "\" existiert bereits.");
      85. }
      86. else
      87. result.Create();
      88. foreach (var d in dir.EnumerateDirectories())
      89. {
      90. d.MoveTo(Path.Combine(destDirName, d.Name), merge, options);
      91. }
      92. foreach (var f in dir.EnumerateFiles())
      93. {
      94. var newPath = Path.Combine(result.FullName, f.Name);
      95. switch (options)
      96. {
      97. case OverwriteOptions.None:
      98. if (File.Exists(newPath))
      99. throw new IOException("Die Datei \"" + newPath + "\" existiert bereits.");
      100. f.MoveTo(newPath);
      101. break;
      102. case OverwriteOptions.DontOverwrite:
      103. if (!File.Exists(newPath))
      104. f.MoveTo(newPath);
      105. break;
      106. case OverwriteOptions.OverwriteAll:
      107. var newF1 = new FileInfo(newPath);
      108. if (newF1.Exists)
      109. newF1.Delete();
      110. f.MoveTo(newPath);
      111. break;
      112. case OverwriteOptions.OverwriteWhenNewer:
      113. var newF2 = new FileInfo(newPath);
      114. if (newF2.Exists)
      115. {
      116. if (newF2.LastWriteTime > f.LastWriteTime)
      117. {
      118. newF2.Delete();
      119. f.MoveTo(newPath);
      120. }
      121. }
      122. else
      123. f.MoveTo(newPath);
      124. break;
      125. case OverwriteOptions.Rename:
      126. var count = 1;
      127. while (File.Exists(newPath))
      128. {
      129. count++;
      130. newPath = Path.Combine(result.FullName, string.Concat(Path.GetFileNameWithoutExtension(f.Name), " (", count, ")", f.Extension));
      131. }
      132. f.MoveTo(newPath);
      133. break;
      134. }
      135. }
      136. dir.Delete();
      137. return result;
      138. }
      139. }
      140. /// <summary>
      141. /// Gibt an, wie bei einem Kopiervorgang verfahren werden soll, wenn die Zieldatei bereits existiert.
      142. /// </summary>
      143. public enum OverwriteOptions
      144. {
      145. /// <summary>
      146. /// Wenn die Datei bereits existiert, wird ein Fehler ausgelöst.
      147. /// </summary>
      148. ThrowError,
      149. /// <summary>
      150. /// Dateien werden nie überschrieben.
      151. /// </summary>
      152. DontOverwrite,
      153. /// <summary>
      154. /// Dateien werden immer überschrieben.
      155. /// </summary>
      156. OverwriteAll,
      157. /// <summary>
      158. /// Dateien werden nur überschrieben, wenn sie älter sind als die neue Datei.
      159. /// </summary>
      160. OverwriteWhenNewer,
      161. /// <summary>
      162. /// Neue Dateien werden umbenannt, wenn die Zieldatei existiert.
      163. /// </summary>
      164. Rename
      165. }

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()