Dateien kopieren..

  • VB.NET
  • .NET (FX) 4.0

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Dateien kopieren..

    Hallo

    Ich brauche eine Hilfe.
    Ich habe eine Liste mit Dateien unterschiedlichster Anzahl, alle vom selben Typ, z.B. *.doc
    Dann habe ich auf meinen USB-Festplatten viele Ordner mit Daten von diesem Typ.

    Nun möchte ich mir ein kleines Tool erstellen, wo ich z.B. diese Liste in eine Texbox rein kopiere und dann soll das Tool genau diese Dateien von der USB-Platte in ein Tempverzeichnis auf mein PC kopieren.
    Den Quell und Zielodrner auszuwählen usw. habe ich schon fast fertig...

    Wie lese ich nun die Textbox in die For Each ein oder gibt es einen anderen einfacheren Weg?
    Achja, die Einträge der Liste, können durch KOMMATA oder LEERzeichen oder Zeilenumbruch getrennt sein. Eine einfache *.txt
    Danke

    VB.NET-Quellcode

    1. tb_inputs '----???
    2. For Each file In IO.Directory.GetFiles("sourcepath")
    3. My.Computer.FileSystem.CopyFile(file, "temppath")
    4. Next

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Mal zum Verständnis. Du hast eine Textdatei, in der bereits alle Dateinamen und Verzeichnisse stehen? Also du hast alles zusammen was du in dein TEMP Verzeichnis kopieren willst?
    Und diese Datei liest du in eine TextBox ein? Warum?
    Aber ok, und wie sieht dein STRING dann aus? (Beispiel)
    @ThomasG82

    NEIN... Ich habe nur die Dateinamen in der Textdatei drin.

    Das mit den Verzeichnissen, da meinte ich das ich den VB-Code schon fast fertig habe...
    Mit OpenBrows usw lege ich mir die Verzeichnisse fest und spiecher diese in den Programmeinstellungen.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ja
    Zum Beispiel: xyz.doc, qwe.doc ....
    oder
    xyz.doc qwe.doc
    oder
    xyz.doc
    qwe.doc
    usw....

    Leider gibt es da noch kein einheitliches System, wie z.B. immer mit Kommata getrennt....
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ok, dann musst du ein einheitliches System schaffen, wie du die Dateinamen einträgst. Natürlich kannst du auch tausend verschiedene Varianten nutzen aber dann musst du auch dementsprechend abfragen und das ist kein ordentliches Codieren.
    Für den Fall, dass du dich entscheidest je einen Dateinamen pro Zeile zu nutzen wäre dies eine Möglichkeit deine Textdatei einzulesen und entsprechend weiter zu verarbeiten:

    VB.NET-Quellcode

    1. Dim DeineDateien() As String = File.ReadAllLines(DeinteTextdatei.txt)
    2. Dim aktuelleDatei As String
    3. For Each aktuelleDatei In DeineDateien
    4. 'dein Code
    5. Next

    Also erst Zeilenweise einlesen, dann immer weiter verarbeiten
    Du könntest hier auch Codezeilen sparen und direkt über eine Schleife auf DeineDateien() zugreifen.
    Ich habe es jetzt nur so gemacht, da ich in diesem speziellen Fall auch noch aktuelleDatei bearbeitet hatte (Pfadangaben ändern usw.)

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

    Amelie schrieb:

    Achja, die Einträge der Liste, können durch KOMMATA oder LEERzeichen oder Zeilenumbruch getrennt sein. Eine einfache *.txt
    Wie kommt denn diese Text-Datei zustande?
    Lies sie ein, splitte an allen Trennzeichen und bau Dir so ein Array mit all Deinen Zieldateien auf.
    Kopieren kannst Du ja inzwischen.
    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!
    @Amelie

    Wie erwähnt worden ist, die Datei auslesen und gleich splitten.

    Ich würde da sogr noch mit FileINfo arbeiten, den FileInfo besitzt auch die CopyTo, das Kopieren von Dateien an einen anderen Ort.

    Was nicht aus deinem Text herausgeht, ist ob der USB-Datenträger Verzeichnisse besitzt. D.h. es stellt sich die Frage müssen die Dateien zuerst auf dem USB-Datenträger gesucht werden? Wenn ja, dann lade all entsprechende Dateitypen aus allen Verzeichnissen/Unterverzeichnisse in eine ListOfFileInfo, (eventuell auch noch gleich nach Fullname sortieren) und von da an weisst du wie es weiter geht.

    Freundliche Grüsse

    exc-jdbi
    @exc-jdbi &&&&

    Ich bin nun soweit das ich die Namen in einer Listbox aufgelistet bekomme und das dann in ein Array packe. Außerdem wird die Quelle mittels FolderBrowserDiakog ausgewählt.
    Nur dann hmmm....??????
    WIe bekomme ich den File.copy dazu nur diese aus dem QuellVerzeichnis zu kopieren?

    VB.NET-Quellcode

    1. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    @Amelie Du hast die Dateien bereits in einer ListBox aufgelistet.
    Wozu packst Du sie noch mal in ein Array?
    Was kommt bei filename(fname) raus???
    Die ersten 4 Zeilen Deiner For-Schleife kannst Du zusammenfassen:

    VB.NET-Quellcode

    1. Dim sourceFile = Path.GetFileName(filename(fname))
    2. Dim tempFilePath = mstrTempdir & "\" & sourceFile
    Wenn Du, wie @exc-jdbi bereits schrieb, fname in eine FileInfo-Instanz packst, wir Dein Code wesentlich übersichtlicher und kürzer.
    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!
    Deswegen fragte ich gestern wie sie an die Dateinamen kommt und was in der Textdatei steht. Denn wenn der "Nutzer" die Dateien über einen Dialog auswählt, dann ist ja auch der Verzeichnisname bekannt und kann letztlich auch in der Textdatei gespeichert werden. Somit wären ja alle benötigten Informationen sowieso bekannt und vorhanden.
    Hm :-|
    @RodFromGermany & @ThomasG82

    Nochmal zum Verständnis. Die Daten bekomme ich per Whatsap oder email oder oder... einfach nur als Werte. Beispiel: _1txt0001 usw.
    Ich habe es nun so gemacht, das ich mir diese Werte da rauskopiere und in eine Textbox mit Zeilenumbruch als Trenner in meinem Tool reinkopiere.
    Auf meiner Platte habe ich nun Verzeichnisse mit den entsprechenden Dateien: Beispiel: Verzeichnis1\_1txt0001.doc usw. manchmal 300 oder noch mehr. Nun soll das Tool eben nur diese (Beispiel) 10 Stück die ich per Nachricht erhalte kopieren.

    Fehlermeldung:

    VB.NET-Quellcode

    1. sourceFile = Path.GetFileName(filename(CInt(fname)))

    Ungültige Konvertierung von der Zeichenfolge _txt0001 in Typ Integer.

    Meine Idee war nun direkt aus der Textbox oder Listbox zu lesen und die Daten zu kopieren, deswegen auch meine Anfangsfrage ob das einfacher geht.


    Meine letzte Idee... Aber es werden alle Dateien in LB2 aufgelistet...

    VB.NET-Quellcode

    1. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amelie“ ()

    Amelie schrieb:

    Aber es werden alle Dateien in LB2 aufgelistet...
    die 200 statt der 10?
    Liest Du aus der richtigen Datei ein?
    Da hilft nur zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!
    @RodFromGermany

    Ja es werden alle Dateien in diesem Verzeichnis aufgelistet bzw ... 200mal Die Datei: _1txt0001.doc
    Habs nun nochmal mit einem andrem Ansatz versucht.. das gleiche...
    Gleich wieder gelöscht... ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich störe mich auch gerade an deiner Variable filename. Was genau steht denn in filename drin? Das müsstest du debuggen. Denn laut deinem Code stehen alle Dateien drin, die du im Verzeichnis mstrSourcepath hast. Denn Directory.GetFiles(mstrSourcepath) liest dir ja eine Datei nach der anderen in deine Variable filename ein. Du hast ja keinen Suchparameter angegeben. SchauMalHier
    Damit wird dir natürlich in deine ListBox2, dadurch dass du sie in der FOR EACH Schleife befüllst nicht nur dein Treffer sondern jede Datei aufgeführt.

    mstrSourcepath enthält ja das Verzeichnis aus dem du kopieren sollst, richtig?
    fname ist die Datei, die du kopieren sollst, richtig?

    Du musst glaub ich wirklich mal dir Haltepunkte setzen um zu sehen wie deine Variablen befüllt sind wenn du die Schleife durchläufst.

    Ich hoffe @RodFromGermany kann dir da helfen, für mich ist das ein KuddelMuddel und ergibt im Code keinen Sinn.
    @ThomasG82

    mstrSourcepath enthält ja das Verzeichnis aus dem du kopieren sollst, richtig?
    fname ist die Datei, die du kopieren sollst, richtig?

    Ja das stimmt so.

    Von meinem Verständnis bin ich gerade am überlegen ob das mit For Each der richtige Weg ist?
    Ich müßte doch nur eine Schleife bauen, welche bei jedem durchlauf ein ITEM aus der Listbox nimmt, dann die entsprechende Datei kopiert usw.
    Richtig???
    Die Dateien sind ALLE vom selben Typ. *.doc oder manchmal *.txt aber nie gemischt, also brauche ich doch keine suchparameter?

    Aber wie stelle ich das an? Do While ??? hmmmm
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    1. das Einlesen deiner benötigten Datei aus z.B. der TextBox oder aus einer externen Datei (das hast du ja) in eine Array-Variable - MeineGesuchtenDateien()
    2. durchlaufen des Arrays z.B. FOR EACH um jeden einzelnen Eintrag abzuarbeiten
    3. durchsuchen deiner Verzeichnisse ob dort die Datei vorhanden ist - hast du hier mit der FOR EACH Schleife und dem Directory.GetFiles, würde ich halt vorschlagen, dass du gezielt deine Datei, aktuell in der ersten FOR EACH Schleife angewählt, als Suchparameter angibst, denn so wie du es machst wird dir in deine Variable (hier filename) ja jede Datei geschrieben, die in dem Verzeichnis vorhanden ist
    4. die Datei nun anpacken und kopieren - hast du mit deinem Files.Copy

    Das Ergebnis von Directory.GetFiles ist ja ein Resultat - ja es gibt Dateien und zwar ...,...,...,...,usw oder wenn du gezielt suchst dann DeinVerzeichnis\DeineDatei und damit kannst du ja arbeiten. Denn da hast du ja alles drin was du brauchst - Verzeichnisbaum und Dateiname.
    @ThomasG82
    dass du gezielt deine Datei, aktuell in der ersten FOR EACH Schleife angewählt, als Suchparameter angibst,


    Habe nun das aber .....
    Fehler den ich nicht verstehe... Übersehe ich etwas??

    VB.NET-Quellcode

    1. END sUB
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Womit wir wieder bei einer FileInfo-Instanz sind.
    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!