0 konnte nicht gefunden werden (Schleifen)

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    0 konnte nicht gefunden werden (Schleifen)

    Hallo,
    ich hab das Problem das wenn ich eine Schleife benutze um Dateien aus einem Ordner zu kopieren das dann immer folgende Fehlermeldung kommt:
    Die Datei 0 konnte nicht gefunden werden.

    Nun wird in einer ListBox der Inhalt also auch der Pfad vom Ordner aufgelistet und die Schleife soll die Dateien welche in der ListBox aufgeführt werden kopieren... Leider weiss ich nicht wie ich das Problem lösen kann.

    VB.NET-Quellcode

    1. Dim Programme As String
    2. If My.Computer.FileSystem.DirectoryExists("C:\Program Files (x86)") Then
    3. Programme = "C:\Program Files (x86)\MEIN ORDNER"
    4. Else
    5. Programme = "C:\Programme\MEIN ORDNER"
    6. End If
    7. For z = 0 To ListBox1.Items.Count - 1
    8. My.Computer.FileSystem.CopyFile(z, Programme)
    9. Next

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

    Die CopyFile-Anweisung erwartet zwei Dateinamen (inkl. Pfad)
    Du übergibst mit "z" aber nur eine Zahl. (Und 'Programme' ist auch falsch, weil in beiden Fällen der If-Abfrage nur ein Pfad, aber kein Dateiname angegeben wird)

    VB.NET-Quellcode

    1. Programme = "C:\Programme\MEIN ORDNER" '--> Dateiname fehlt


    VB.NET-Quellcode

    1. For z = 0 To ListBox1.Items.Count - 1
    2. My.Computer.FileSystem.CopyFile(z, Programme)
    3. ...
    Das liegt daran das der erste Parameter von CopyFile der SourcePath ist und du dort einfach die Variable z einsetzt die nur Zahlen von 0 bis zur ListBox1.Items.Count enthält und 0,1,2... dürften keine gültigen Dateien sein.

    Wahrscheinlich willst du mit z auf ein Item in der Listbox zugreifen. Einfach bei Listbox.Item den Index also in dem Fall z übergeben.

    //EDIT: Zu spät ;)
    Ich weiss das dort der Fehler liegt aber ich bin hilflos da ich nicht weiss wie ich die Zahl, also das Item welches grad ausgewählt ist mit dem Inhalt verknüpfe.

    EDIT auch von mir: Genau das meine ich was du sagst, nur hab ichs nicht so mit Schleifen, ich versteh grad nichts mehr so richtig, z ist doch der Index, also das ausgewählte Item oder nicht? Wie kann ich dann den Inhalt des Items in z laden? :wacko: *verwirrt sein*
    Achso... auf die Idee bin ich gar nicht gekommen. Komisch das ich immer nur schwere Sachen aber keine Leichten lösungen sehe.

    Danke! Ich werd schauen obs klappt, was es wahrscheinlich tun wird :) ihr habt mir grad in 5 Minuten ein Problem gelöst wo ich schon seit einem Monat dran sitze :D

    EDIT:
    Die CopyFile-Anweisung erwartet zwei Dateinamen (inkl. Pfad)
    Genau das Problem ist mir jetzt aufgetaucht, wie schaffe ich es das der Dateiname der kopierten Datei übernommen wird? Also in der ListBox wird ja der Pfad inkl. Datei angegeben und wenn ich den übernehmen würde, würde er als Dateinamen den Pfad mit reinschreiben oder nicht?

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

    Dir sollte bewusst sein, dass ab Windows Vista aus Sicherheitsgründen das Schreiben ins ProgrammFiles-Verzeichnis für normale Benutzer nicht zulässig ist. Also Beim Anlegen des Programmordners bzw. beim Kopieren der Dateien prüfen, ob der Vorgang erfolgreich war oder nicht.

    Ein ausführlicheres Beispiel:
    Ermitteln des Dateinamen eines absoluten Pfades -> mit String und Split arbeiten oder IO.Path.GetFileName

    VB.NET-Quellcode

    1. ' Programm-Verzeichnis definieren, z.B. C:\Programme\MeinProgramm
    2. Dim myProgramDir As String = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MeinProgramm")
    3. ' Verzeichnis erstellen, falls noch nicht vorhanden
    4. If Not IO.Directory.Exists(myProgramDir) Then
    5. Try
    6. IO.Directory.CreateDirectory(myProgramDir)
    7. Catch ex As Exception
    8. MsgBox("Verzeichnis konnte nicht erstellt werden." & vbNewLine & ex.Message)
    9. End Try
    10. End If
    11. For z As Integer = 0 To ListBox1.Items.Count - 1
    12. Dim quellDatei As String = CType(ListBox1.Items(z), String)
    13. Dim zielDatei As String = IO.Path.Combine(myProgramDir, IO.Path.GetFileName(quellDatei))
    14. Try
    15. IO.File.Copy(quellDatei, zielDatei)
    16. Catch ex As Exception
    17. MsgBox("Datei " & quellDatei & " konnte nicht nach " & myProgramDir & " kopiert werden.")
    18. End Try
    19. Next

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

    Ok danke, jetzt weiss ich was ich alles mit den Dateien machen kann ;) Falls du mir nicht zeigen wolltest was ich mit den Dateien machen kann weiss ich leider nicht worauf du hinaus willst :(

    Dir sollte bewusst sein, dass ab Windows Vista aus Sicherheitsgründen das Schreiben ins ProgrammFiles-Verzeichnis für normale Benutzer nicht zulässig ist. Also Beim Anlegen des Programmordners bzw. beim Kopieren der Dateien prüfen, ob der Vorgang erfolgreich war oder nicht.
    Das kommt zuletzt, erstmal müssen doch die eigentlichen Probleme beseitigt werden oder nicht?

    Also zu meinem jetzigen Problem:
    Wie kann ich den alten Dateinamen zum neuen übernehmen oder muss ich wieder so kompliziert machen?
    von dussl:
    Falls du mir nicht zeigen wolltest was ich mit den Dateien machen kann weiss ich leider nicht worauf du hinaus willst :(
    was soll der dämlicher spruch ?
    ich habe dir link gepostet was du machen kannst, schau dir genau an, da steht alles beschrieben was du machen kannst und wie du machen kannst !
    by !
    Dateien kopieren
    Das Kopieren von Dateien erfolgt über die Copy-Methode der File-Klasse. Das folgende Beispiel kopiert die Datei "Test.txt" von Laufwerk E: nach dem Ordner D:\Temp:
    ' Datei kopieren
    File.Copy("E:\Test.txt", "D:\Temp\Test.txt", True)
    Mit dem letzten Parameter (override) legen Sie fest, ob eine vorhandene Datei überschrieben werden darf (true) oder nicht (false).
    Hinweis: Geben Sie den Zielordner immer mit abschließendem Backslash (\) ein, damit ein Fehlverhalten erst gar nicht auftritt.
    Soweit bin ich doch schon nur weiss ich nicht wie ich den alten Dateinamen übernehmen kann... Es ist ein nicht vorgegebener Name sondern der alte wie vorher. Oder ist meine Frage blöd gestellt das ihr mich nicht versteht?

    EDIT! Achso sorry, ich hab das Codebeispiel von xtts nicht gesehen, nicht bemerkt das er da was editiert hat. Das könnte mein Problem lösen, mal schauen!