Klasse(n) Frage zum simultanen Kopieren von Dateien

  • VB.NET
  • .NET (FX) 4.0

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

    Klasse(n) Frage zum simultanen Kopieren von Dateien

    Auch auf die Gefahr hin, dass der ErfinderDesRades jetzt ganz laut aufstöhnt, ich stelle meine Frage trotzdem ^^

    Ich habe als blutiger Anfänger ein kleines Programm geschrieben, das zwischen zwei Rechnergruppen (nennen wir sie A-F und 1-10) sehr große Dateien hin und her kopiert. Das Programm selbst läuft auf einem unbeteiligten Rechner. Aufgrund meines anfangs erwähnten Kenntnisstandes habe ich in ein Forms mehrere Backgroundworker integriert, was eigentlich hervorragend funktioniert. Allerdings wird es unübersichtlich, wenn ich die Sache noch skalieren möchte.
    Nun meine Grundsatzfrage:
    Wenn ich von der bestehenden Lösung weg möchte und eine Klasse schreibe, die genau einen Kopiervorgang durchführt - kann ich diese, weil die Kopiervorgänge sehr lange dauern - mehrfach aufrufen und wie würde ich diverse Parameter übergeben? Nehmen wir an, in der Klasse ist ein String als Kopierziel deklariert. Rufe ich die Klasse nun ein zweites Mal auf - wird die Variable "Kopierziel" dort überschrieben oder ist das "gekapselt"?

    VB.NET-Quellcode

    1. Public Class superkopierer
    2. Public source As String
    3. Public destination As String
    4. public Sub CopyFolder(ByVal sSrcPath As String, ByVal sDestPath As String, Optional ByVal boverwrite As Boolean = True)
    5. Try
    6. Dim oDir As New System.IO.DirectoryInfo(sSrcPath)
    7. Dim oFiles As System.IO.FileInfo() = oDir.GetFiles()
    8. Dim oFile As System.IO.FileInfo
    9. If Not System.IO.Directory.Exists(sDestPath) Then
    10. System.IO.Directory.CreateDirectory(sDestPath)
    11. End If
    12. For Each oFile In oFiles
    13. If oFile.Name <> ("Thumbs.db") Then
    14. End If
    15. If oFile.Name <> "Thumbs.db" And System.IO.File.Exists(sDestPath & oFile.Name) = False Then
    16. System.IO.File.Copy(sSrcPath & oFile.Name, sDestPath & oFile.Name, True)
    17. End If
    18. Next
    19. Catch ex As Exception
    20. main.errorlog(1, ex.Message)
    21. End Try
    22. End Sub
    23. End Class


    (Simultaner) Aufruf dann mit

    VB.NET-Quellcode

    1. superkopierer.copyfolder(source, target)


    ??

    Danke für Eure geduldigen Antworten sagt schon mal der


    Vielfrager
    Hallo,

    du könntest das mit Threads lösen, so würden die Sachen auch mehr oder weniger parallel laufen (je nachdem wann du sie startest).

    Schau mal hier und/oder hier, du eröffnest also für jeden Kopier-Vorgang einen neuen Thread und übergibst im die Aufgabe den Kopiervorgang zu übernehmen.

    Sobald du sowas nämlich den Haupt-Thread machen lässt friert alles so lange ein, bis der Vorgang rum ist.

    Eventuell sind die Links nicht ganz so geil, dann sollte aber die Google-Suche nach "vb threading example" was ausspucken ;)

    vielfrager schrieb:

    gekapselt
    wird das, indem Du einen kompletten Kopiervorgang in einer separaten Klasse beschreibst.
    Pro realem Kopiervorgang erstellst Du dann je eine Instanz dieser Klasse und feddich.
    Wenn das Kopieren parallel erfolgen soll (quasi gemeinsamer Start), hast Du mit Parallel.For() bzw. Parallel.ForEach() keinen Aufwand mit Threads.
    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!
    Über das Threads-Stadium bin ich ja insofern schon hinweg, als dass jetzt hier in einer Form 10 BGW's asynchron vor sich hin werkeln. Mit mehr wirds aber extrem unübersichtlich (mom. sind es schon mit allem Drum und dran 25000 Zeilen).
    Daher die Idee der Klassenlösung. Da ich als Anfänger aber mit einem einfachen Forms begonnen und dort alles reingepackt habe, sind verschiedene Klassen noch Neuland. Aber bekanntlich lernt man im Wasser erst schwimmen...
    Exakt parallel ist es ja auch nicht, denn die Kopiervorgänge haben unterschiedliche Startzeiten, überschneiden sich aber aufgrund der Kopierzeiten. Würde es prinzipiell also so wie oben geschrieben funktionieren?

    vielfrager schrieb:

    Würde es prinzipiell also so wie oben geschrieben funktionieren?
    Trenne zunächst die Funktionalität GUI und Kopieren, die BGW solltest Du in Perspektive rausschmeißen.
    Ohne Instanzen von Klassen müssen wir hier nicht weiterreden, das bringt nix.
    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!

    vielfrager schrieb:

    ein paar Infos
    Fang an und erstell eine separate Klasse.
    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!
    Genau das habe ich vor und deswegen oben gefragt, ob es so prinzipiell richtig ist und die einzelnen Instanzen (die einzelnen Kopiervorgänge) voneinander isoliert sind. Warum so missgestimmt?


    Unnötiges Vollzitat entfernt
    -Artentus

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

    Schau mal hier:
    msdn.microsoft.com/en-us/library/kztecsys.aspx

    Wenn du in deiner Klasse die Methode Asynchron laufen lässt dann brauchst du eigentlich auch nur eine Instanz der Klasse. Du solltest nur keine Properties verwenden sondern alles über Parameter für die Methode mitgeben. (Also Destination und Source Path)
    Das ist meine Signatur und sie wird wunderbar sein!

    vielfrager schrieb:

    Warum so missgestimmt?
    Weil alles schon da steht und Du offensichttich keinen Plan zur Umsetzung hast. ;(
    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!
    Ja, kann sein, dass es aus Profisicht planlos aussieht. Trotzdem wäre es schön, wenn mir jemand im Sinne dieses Forums -Wissen zu teilen - helfen könnte, Licht ins Dunkel zu bringen.
    Wie schon geschrieben, arbeitet die Anwendung jetzt mit Backgroundworkern, ich möchte aber dazu lernen und den Code vereinfachen. Eine Klasse "Kopierer" kann ich mit den vorhandenen Kenntnissen erstellen, bekomme es aber momentan nicht hin, mehrere Instanzen parallel aufzurufen.
    Kann mir jemand ein Beispiel geben, wie das z.B. mit Parallels.for realisierbar wäre?

    Danke vom Vielfrager
    Fragen wir doch mal andersrum: Wie startest du denn jetzt zwei Kopiervorgänge (unbeachtlich der Tatsache, das sie hintereinander weg laufen würden) ?

    Ich hab so den Eindruck, unser TE hat von Klassen, Instanzen und derlei Zeugs noch fast gar nix verstanden ;)
    Es geht um sehr lange Kopiervorgänge (Ordner mit unterschiedlich vielen Unterebenen), die zu unterschiedlichen Zeiten starten, enden und sich zeitlich überschneiden.
    Ich habe mehrere Backgroundworker, die asynchronn je einen Vorgang bearbeiten. Das funktioniert sehr gut, wird aber aufgrund der zeitgleich möglichen Vorgängen (aktuell sind 10 erforderlich) langsam unübersichtlich und ist kaum noch skalierbar.


    Unnötiges Vollzitat entfernt
    -Artentus

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

    vielfrager schrieb:

    Es geht um sehr lange Kopiervorgänge
    Wenn das Ziel ein und dieselbe Festplatte ist, sollte das ganze seriell erfolgen, denn die Mechanik der Festplatte ist nicht multitasking-fähig.
    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!