Dateien aus Ordnerstruktur in EINEN Ordner kopieren

  • VB.NET

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

    Dateien aus Ordnerstruktur in EINEN Ordner kopieren

    Lieb VB Gemeinde

    Habe folgendes Problem. Ich habe hier ca. 500.000 Dateien in einer komplexen Ordnerstruktur.

    Diese Dateien sollen in einen Ordner kopiert werden. Doppelte Dateien sollen dabei einfach überschrieben werden.

    Kopieren im Explorer fällt flach, da er nur ca. 50.T zulässt. Muss das in 5 Tagen drei mal machen! ;(

    Hab schon viel ausprobiert, aber nichts mit dem gewünschten Erfolg.

    Vielen Dank für eure Bemühungen.

    Basti
    Hi,

    du sagst doppelte Dateien sollen einfach überschrieben werden.
    Heißt das in der Ausgangsstruktur gibt es die gleiche Datei mehrfach? Wenn ja... Sollte dann nicht anhand der letzten Änderung geprüft werden, ob die Datei die schon existiert neuer ist?

    VB.NET-Quellcode

    1. Dim dir As New System.IO.DirectoryInfo(zuDurchsuchenTextBox.Text)
    2. For Each fi As System.IO.FileInfo In dir.GetFiles(System.IO.SearchOption.AllDirectories)
    3. fi.CopyTo(System.IO.Path.Combine(Me.SpeicherpfadTextBox.Text, fi.Name))
    4. Next


    So als grobes Konzept und schnell geschrieben XD
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @BastiD: Willkommen im Forum. :thumbup:
    Bei den vielen Dateien würde ich schon nachsehen, ob die Datei schon da ist und sie dann nicht überschreiben, das spart etwas Zeit.
    Oder
    Müssen die Dateien kopiert oder können sie auch bewegt werden?
    Weil Bewegen (MoveTo(...) geht sehr viel schneller.
    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!
    Ich denke mal du möchtest da für die Firma irgendeine Ordnerstruktur (bzw. deren Inhalte) auf nem Sicherungslaufwerk sichern.
    Hier solltest du bestimmte Dinge prüfen.
    1. Sollen identische Dateien mit unterschiedlichem Namen nu einmal hinterlegt werden?
    2. Sollen nur identische Dateien oder Dateien mit gleichem Namen ersetzt werden?
    3. Werden die Dateien weiterhin auf dem Ausgangslaufwerk gebraucht? Sprich (wie Rod sagt) kannst du die Dateien verschieben oder musst du sie kopieren.

    Aus Frage 2 ergibt sich dann noch die Frage... Wie behandelst du zwei Dateien die gleich heißen aber unterschiedlich sind. Ersetzen der Reihe nach, wie sie so dran kommen? Ersetzen anhand des Änderungsdatum oder kann es sogar sein, dass zwei Dateien gleich heißen aber nix miteinander zutun haben? zB. "Tutorial.pdf"?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Danke!

    Dateien in der Ordnerstruktur dürfen nicht verändert werden!

    Dateien die gleich heißen aber Unterschiedlich sind, sollte die neuere Datei die alte Überschreiben. Da wäre also ein Abgleich nötig.

    Danke für den Hinweis

    Basti
    Dann solltest du in die Schleife noch mit den Befehlen

    VB.NET-Quellcode

    1. fileinfo.Exists
    2. fileinfo.LastWriteTime

    prüfen welche Datei denn nu aktueller ist.
    Würd ja gern dann die Lösung dazu sehen ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    @BastiD:

    RodFromGermany schrieb:

    Müssen die Dateien kopiert oder können sie auch bewegt werden?
    Weil Bewegen (MoveTo(...) geht sehr viel schneller.
    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!
    Wie sieht denn dein Code derzeit aus? Kann man sich sicher sein, dass der richtige Pfad verwendet wird? Ist bei solchen Sachen gerne mal die Fehlerquelle.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Dim dir As New System.IO.DirectoryInfo("D:\BA1145_struktur\")
    Dim fi As System.IO.FileInfo
    Dim Speicherpfad As String = "D:\Deltaversuch\"
    For Each fi In dir.GetFiles(System.IO.SearchOption.AllDirectories)
    fi.CopyTo(System.IO.Path.Combine(Speicherpfad.ToString, fi.Name))
    Next

    Die Pfade findet er und gibt auch die Daten zurück.
    Die Zeile Dim fi überspringt er.

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

    Wieso machste denn das

    VB.NET-Quellcode

    1. Dim fi As System.IO.FileInfo
    ?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Mit welcher Meldung bricht er die Schleife denn ab?
    Wenn keine kommt, sieht das für mich so aus, als würde er keine Datei in dem jeweiligen Ordner auffinden oO

    EDIT:
    Mein Fehler...

    VB.NET-Quellcode

    1. For Each fi As System.IO.FileInfo In dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)

    Wenn du mit gibst, er soll alle Unterordner durchsuchen, musst ihm nen Suchmuster angeben.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Siehe mein obiges Edit. ;)

    Ich habe mal bei mir

    VB.NET-Quellcode

    1. Dim dir As New System.IO.DirectoryInfo("C:\Users\....\Desktop\UmsatzAuswertung")
    2. Dim Speicherpfad As String = "C:\Users\....\Desktop\Save"
    3. For Each fi As System.IO.FileInfo In dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
    4. Dim fi2 As New System.IO.FileInfo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    5. If fi2.Exists Then
    6. If fi.LastWriteTime > fi2.LastWriteTime Then fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name), True)
    7. Else
    8. fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    9. End If
    10. Next

    getestet. Das rennt problemlos durch.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Vielen Dank für die Hilfe.

    Hier der endgültige Code mit Rückgabe der Dateianzahl und Zeit:

    Private Sub bt_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_Start.Click
    bt_Start.Visible = False
    Dim dir As New System.IO.DirectoryInfo(tb_zuDurchsuchen.Text)
    Dim Speicherpfad As String = tb_Speicherpfad.Text
    Dim i As Integer = 0
    Dim Starttime As DateTime
    Dim Time As DateTime
    Dim dtime As TimeSpan
    Starttime = Now
    For Each fi As System.IO.FileInfo In dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
    i = i + 1
    Dim fi2 As New System.IO.FileInfo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    If fi2.Exists Then
    If fi.LastWriteTime > fi2.LastWriteTime Then fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name), True)
    Else
    fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    End If
    tb_Teil.Text = i.ToString
    Time = Now
    dtime = Time - Starttime
    tb_Time.Text = dtime.ToString

    Me.Refresh()
    Next

    bt_Start.Visible = True

    End Sub

    Basti
    Hi,

    kleine Bitte noch...
    Wenn du ne Antwort erstellst hast du zwei Reiter "Editor" und "Quellcode"...
    Dort auf Quellcode gehen und den Button "VB" benutzen.
    Dann wird der in den VB Tags enthaltenen Text auch im Forum als VB-Code formatiert.
    Hier dein Code:

    VB.NET-Quellcode

    1. Private Sub bt_Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_Start.Click
    2. bt_Start.Visible = False
    3. Dim dir As New System.IO.DirectoryInfo(tb_zuDurchsuchen.Text)
    4. Dim Speicherpfad As String = tb_Speicherpfad.Text
    5. Dim i As Integer = 0
    6. Dim Starttime As DateTime
    7. Dim Time As DateTime
    8. Dim dtime As TimeSpan
    9. Starttime = Now
    10. For Each fi As System.IO.FileInfo In dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
    11. i = i + 1
    12. Dim fi2 As New System.IO.FileInfo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    13. If fi2.Exists Then
    14. If fi.LastWriteTime > fi2.LastWriteTime Then fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name), True)
    15. Else
    16. fi.CopyTo(System.IO.Path.Combine(Speicherpfad, fi.Name))
    17. End If
    18. tb_Teil.Text = i.ToString
    19. Time = Now
    20. dtime = Time - Starttime
    21. tb_Time.Text = dtime.ToString
    22. Me.Refresh()
    23. Next
    24. bt_Start.Visible = True
    25. End Sub


    Tips:

    VB.NET-Quellcode

    1. i = i + 1

    ist gleich

    VB.NET-Quellcode

    1. i += 1

    für schreibfaule ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    BastiD schrieb:

    MemoAnMichSelbst schrieb:

    VB.NET-Quellcode

    1. dtime = Time - Starttime
    Dafür gibt es StopWatch.
    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!