Alle Dateien eines Bestimmten Dateitypes aus einem Verzeichnis incl. Unterordner in einen Ordner kopieren.

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Alle Dateien eines Bestimmten Dateitypes aus einem Verzeichnis incl. Unterordner in einen Ordner kopieren.

    Hallo, mir stellt sich folgendes Problem.
    Ich habe für jemanden eine Festplatte wiederhergestellt, und somit auch ca 100.000 Dateien der Typen txt; doc; docx und JPG in das Wiederherstellungsverzeichnis kopiert. Das Program mach bei der Wiederherstellung leider etliche Unterordner auf und kopiert so immer nur paar MB in ein VZ.

    Wenn ich die Platte nun zurückgebe, würde ich das ganze gerne sortiert abgeben.

    1. VZ Bilder
    1. VZ DOC etc

    Wie kann ich nun alles Verzeichnisse incl. unterordner so durchlaufen und die Dateien entsprechend dann kopieren aber ohne die Unterordnerstrucktur.

    Ich habe da schon mal folgenden Ansatz gefunden.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Public Sub CopyFolder(ByVal sSrcPath As String, _
    4. ByVal sDestPath As String, _
    5. Optional ByVal bSubFolder As Boolean = True)
    6. Optional ByVal bOverWrite As Boolean = True)
    7. ' Falls Zielordner nicht existiert, jetzt erstellen
    8. If Not System.IO.Directory.Exists(sDestPath) Then
    9. System.IO.Directory.CreateDirectory(sDestPath)
    10. End If
    11. ' zunächst alle Dateien des Quell-Ordners ermitteln
    12. ' und kopieren
    13. Dim sFiles() As String = System.IO.Directory.GetFiles(sSrcPath)
    14. Dim sFile As String
    15. For i As Integer = 0 To sFiles.Length - 1
    16. ' Falls Datei im Zielordner bereits existiert, nur
    17. ' kopieren, wenn Parameter "bOverWrite" auf True
    18. ' festgelegt ist
    19. sFile = sFiles(i).Substring(sFiles(i).LastIndexOf("\") + 1)
    20. If bOverWrite() Or Not System.IO.File.Exists(sDestPath & "\" & sFile) Then
    21. System.IO.File.Copy(sFiles(i), sDestPath & "\" & sFile, True)
    22. End If
    23. Next i
    24. If bSubFolder Then
    25. ' jetzt alle Unterordner ermitteln und die CopyFolder-Funktion
    26. ' rekursiv aufrufen
    27. Dim sDirs() As String = System.IO.Directory.GetDirectories(sSrcPath)
    28. Dim sDir As String
    29. For i As Integer = 0 To sDirs.Length - 1
    30. If sDirs(i) <> sDestPath Then
    31. sDir = sDirs(i).Substring(sDirs(i).LastIndexOf("\") + 1)
    32. CopyFolder(sDirs(i), sDestPath & "\" & sDir, True, bOverWrite)
    33. End If
    34. Next i
    35. End If
    36. End Sub
    37. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    38. ' Ordner "d:\temp" einschl. aller Unterordner
    39. ' nach "d:\Kopie von temp" kopieren
    40. CopyFolder("d:\Test", "d:\Ziel")



    Leider kommt hier immer der Fehler "bOverWrite" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden. und

    Hier kommt immer ein Syntaxfehler - Optional ByVal bOverWrite As Boolean = True) - Wie muss ich den Code anpassen.

    Danke für Euere Hilfe

    Holger

    debus schrieb:

    Public Sub CopyFolder(ByVal sSrcPath As String, _
    ByVal sDestPath As String, _
    Optional ByVal bSubFolder As Boolean = True)
    Optional ByVal bOverWrite As Boolean = True)

    VB.NET-Quellcode

    1. ​Public Sub CopyFolder(ByVal sSrcPath As String, ByVal sDestPath As String, Optional ByVal bSubFolder As Boolean = True, Optional ByVal bOverWrite As Boolean = True)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    "Ansatz gefunden" -> Quelle nennen!: vb@rchiv.

    ##########

    Du hast in Zeile#6 am Ende eine ). Da gehört ein Komma hin. Das ist, was petaod Dir sagen will.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Das tendiert zu Grundlagen …
    In der Quelle steht If bOverWrite Or Not, bei Dir in Zeile#23 If bOverWrite() Or Not. Quelle: ohne Klammern, bei Dir: mit.

    Es ist wunderbar, dass Du jemandem mit der Festplatte helfen kannst, aber wenn Du kompletter Einsteiger beim Programmieren bist, sag das bitte dazu. Bei anderen, uns bekannten Forenmitgliedern würde ich eiskalt sagen: »Echt jetzt? Sieh Dir die Meldung an, die die Visual Studio liefert und komm selbst auf die Lösung.«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich denke, du meinst die Zeile 36 in deinem OP?
    Code, erst recht wenn man den von irgendwoher übernimmt, sollte man schon verstehen.
    Siehe dir die Zeile genau an, du kommst schon drauf.

    Ein Verbesserungsvorschlag: Zum Zusammenstöpseln von Pfaden sollte man die Funktion Path.Combine benutzen. Aber dort musst du ja nichts mehr zusammenstöpsel, wenn du entdeckst, was ich meine.
    vielleicht übernimmst du die Funktion dann aber für die Zeile 24, weil dort wäre sie angebracht.

    debus schrieb:

    Wenn ich die Platte nun zurückgebe, würde ich das ganze gerne sortiert abgeben.
    Da Du das ganze wohl genau ein Mal exerzierst, mach Dir zwei Explorer nebeneinander auf und ziehe die Dateien aus dem Quellverzeichnis in einem Explorer in das korrekte Zielverzeichnis im anderen Explorer.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Programmiersprache
    Eine Batch-Datei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!