PathTooLongException

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    PathTooLongException

    Hallo, in meinem Programm liste ich die Dateien eines vom Anwender angegeben Verzeichnisses auf.
    Dabei gibt es wenn ich z.B, mein Laufwerk F:\ durchsuche 28 PathTooLongExceptions
    Bspw. ist da eine Datei, die insgesamt 262 Zeichen hat, 248 sind wohl nur erlaubt.

    Hier der Code:, Fehler tritt in Zeile 5 auf:

    Quellcode

    1. For Each Datei In Dateiliste
    2. Try
    3. DataGridView1.Item(0, zähler).Value = System.IO.Path.GetFileName(Datei)
    4. DataGridView1.Item(1, zähler).Value = System.IO.Path.GetDirectoryName(Datei)
    5. Catch ex As System.IO.PathTooLongException
    6. count_pathtoolongexception += 1
    7. Catch ex As Exception
    8. End Try
    9. zähler += 1
    10. Next


    Habe mir jetzt mal so beholfen:

    Quellcode

    1. For Each Datei In Dateiliste
    2. Try
    3. DataGridView1.Item(0, zähler).Value = System.IO.Path.GetFileName(Datei)
    4. DataGridView1.Item(1, zähler).Value = System.IO.Path.GetDirectoryName(Datei)
    5. Catch ex As System.IO.PathTooLongException
    6. count_pathtoolongexception += 1
    7. temp_Path = Datei.Substring(0, Datei.LastIndexOf("\"))
    8. Try
    9. DataGridView1.Item(1, zähler).Value = temp_Path
    10. Catch ex1 As Exception
    11. End Try
    12. Catch ex As Exception
    13. End Try
    14. zähler += 1
    15. Next


    Die Frage dazu ob es eine elegantere Möglichkeit gibt die Exception abzufangen und die zu langen Dateien aufzulisten?
    Du darfst nie einfach Exceptions verschlucken, das wird tödlich enden, weil Du Dich irgendwann totsuchst. Fange explizit den Typ dieser Exception (PathTooLongException) ab und behandle da trotzdem irgendwas (z. B. eine Logausgabe o. ä.).

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja, da werden die ja abgefangen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Humax schrieb:

    VB.NET-Quellcode

    1. Catch ex As Exception
    Streich dies.
    Gugst Du hier, teste mal dies:

    Wiki schrieb:

    Länge von Dateiname und Pfad
    Normalerweise ist die Pfadlänge unter Windows auf 260 Zeichen beschränkt, d. h. drei Zeichen für die Laufwerksangabe, 256 Zeichen für den Pfad innerhalb des Laufwerks und ein nicht sichtbares String-Terminierungszeichen. Längere Pfade bis zu 32767 Zeichen, wie sie von NTFS unterstützt werden, sind mittels UNC (Uniform Naming Convention) möglich, d. h. \\?\ muss vorangestellt werden.
    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!
    Also entweder habe ich es nicht richtig verstanden oder es funktioniert nicht.
    Habe auf 2 arten versucht "\\?\" dem Pfad hinzuzufügen.
    Mit Path.Combine blieb der Pfad unverändert, kam also die selbe Exception
    Mit der 2. Methode hieß der Pfad dann zwar"\\?\Ordern...." es blieb aber bei der Exception.

    Quellcode

    1. For Each Datei In Dateiliste
    2. Datei = System.IO.Path.Combine("\\?\", Datei)
    3. My.Application.DoEvents()
    4. Try
    5. DataGridView1.Item(0, zähler).Value = System.IO.Path.GetFileName(Datei)
    6. DataGridView1.Item(1, zähler).Value = System.IO.Path.GetDirectoryName(Datei)
    7. Catch ex As System.IO.PathTooLongException
    8. count_pathtoolongexception += 1
    9. temp_Path = Datei.Substring(0, Datei.LastIndexOf("\"))
    10. DataGridView1.Item(1, zähler).Value = temp_Path
    11. End Try
    12. zähler += 1
    13. Next


    Quellcode

    1. For Each Datei In Dateiliste
    2. Datei = ("\\?\" & Datei)
    3. My.Application.DoEvents()
    4. Try
    5. DataGridView1.Item(0, zähler).Value = System.IO.Path.GetFileName(Datei)
    6. DataGridView1.Item(1, zähler).Value = System.IO.Path.GetDirectoryName(Datei)
    7. Catch ex As System.IO.PathTooLongException
    8. count_pathtoolongexception += 1
    9. temp_Path = Datei.Substring(0, Datei.LastIndexOf("\"))
    10. DataGridView1.Item(1, zähler).Value = temp_Path
    11. Catch ex As Exception
    12. End Try
    13. zähler += 1
    14. Next

    Humax schrieb:

    Path.Combine
    weiß nix von "\\?\", das musst Du (wohl) explizit hinzufügen.
    Teste das ganze in einem separaten Testprogramm mit kurzen Pfaden.
    (Ich hab es nicht getestet.)
    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!

    Humax schrieb:

    Fehlermeldung
    Hm.
    Dann ist der Beitrag bei Wiki wohl nicht ganz korrekt. :/
    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!
    Also ich habe jetzt noch mal Probiert:
    Wenn die PathTooLongException auftritt, dann kommt folgender Code zum Aufruf, in dem ich den Dateinamen (String)
    neu zusammensetze. Und zwar entweder mit "\\?\" & Dateiname oder mit path.combine
    Anschließend versuche ich nochmals den Dateinamen und den Pfad einzeln meinem Datagrid zuzuweisen.
    Es kommt allerdings in beiden Versuchen zur selben PathTooLongException.

    Der Pfad sieht dann so aus:
    \\?\F:\TEST\ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ\ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ.txt

    Quellcode

    1. Private Function PathTooLong_Convertion(ByVal Datagridrow As Integer, Value As String) As Boolean
    2. Try
    3. Value = "\\?\" & Value
    4. DataGridView1.Item(0, Datagridrow).Value = System.IO.Path.GetFileName(Value)
    5. DataGridView1.Item(1, Datagridrow).Value = System.IO.Path.GetDirectoryName(Value)
    6. Return True
    7. Catch ex As System.IO.PathTooLongException
    8. MessageBox.Show(ex.Message)
    9. Return False
    10. Catch ex As Exception
    11. Return False
    12. End Try
    13. End Function

    Humax schrieb:

    Der Pfad sieht dann so aus:
    Das wäre der Dateiname, nicht aber der Pfad.
    Du musst Dir einen Verzeichnisbaum machen, der hinreichend lang ist.
    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!
    @Humax Sorry, ich hab da einige Backslashes übersehen.
    Ist es sinnvoll, wenn Du Dich mit relativen Pfadnamen abgibst und den langen Pfad duch ein Wechsel in das innere Verzeichnis abkürzest?
    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 schrieb:

    Ist es sinnvoll, wenn Du Dich mit relativen Pfadnamen abgibst und den langen Pfad duch ein Wechsel in das innere Verzeichnis abkürzest?

    Hmmm, ich verstehe nicht was du mich fragst oder mir sagen willst?

    Wenn ich ins Verzeichnis wechseln will bekomme ich auch die Exception

    Quellcode

    1. ​My.Computer.FileSystem.CurrentDirectory = System.IO.Path.GetDirectoryName(Datei)

    Humax schrieb:

    Wenn ich ins Verzeichnis wechseln will
    Nicht so.
    Du musst den Pfad einzeln über die "Zwischenverzeichnisse" abklappern, wie wenn Du im Explorer eine Datei suchst.
    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!
    Also ich habe jetzt wenn die Exception auftritt folgenden Code ausgeführt um den Pfad in seine Einzelpfade zu zerlegen und dann kann ich in jedes einzelne Verzeichnis wechseln.

    Nur weiß ich jetzt nicht was mir das bringt?!

    Quellcode

    1. Private Function pfad_zerlegen(ByVal path As String) As Boolean
    2. Dim pfad_gesplittet(0) As String
    3. ' Dateinamen entfernen
    4. path = path.Substring(0, path.LastIndexOf("\") + 1)
    5. Do While path.Contains("\")
    6. ReDim Preserve pfad_gesplittet(pfad_gesplittet.Length)
    7. path = path.Substring(0, path.LastIndexOf("\"))
    8. pfad_gesplittet(pfad_gesplittet.Length - 1) = path
    9. Loop
    10. Do Until pfad_gesplittet.Length = 1
    11. My.Computer.FileSystem.CurrentDirectory = pfad_gesplittet(pfad_gesplittet.Length - 1)
    12. ReDim Preserve pfad_gesplittet(pfad_gesplittet.Length - 2)
    13. Loop
    14. Return True
    15. End Function


    Nach Ende dieses Codes bin ich im entsprechenden Verzeichnis.