OpenFileDialog - Pfad ist nicht vorhanden

  • VB.NET
  • .NET 4.5

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    OpenFileDialog - Pfad ist nicht vorhanden

    Hallo, ich hatte ja schon einmal ein Problem mit zu langen Pfad/Dateinamen.
    Das ist ja seit Framework 4.6.2 mit Voranstellung von "\\?\" an den Dateinamen Geschichte.
    Jetzt habe ich aber noch ein weiteres Problem wenn ich zu lange Dateinamen habe.

    In meinem Programm (Framework 4.7.2) habe ich einen "Openfiledialog" (OFD). Wenn ich darin eine der Dateien auswähle bekomme ich im Dialog die Meldung "Pfad ist nicht vorhanden".
    Ich habe auch schon folgendes probiert, jedoch ohne Erfolg.

    VB.NET-Quellcode

    1. OFD.CheckFileExists = False
    2. OFD.CheckPathExists = False


    Auch habe ich mal in den Gruppenrichtlinien "Lange Dateinamen erlauben" aktiviert.
    Trotzdem kann ich im Openfiledialog eine Datei mit zu langem Dateinamen nicht auswählen.

    Bisher behelfe ich mir mit einen "Folderbrowserdialog", in dem ich dann alle Dateien eines Verzeichnisses einlesen kann.
    @Humax Wie sieht denn der Pfad genau aus, den Du öffnen willst?
    Ich bekomme beim Erstellen eines langen Pfades den Hinweis, dass er zu 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).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    beim Erstellen

    Ich möchte keinen Pfad erstellen, der Pfad und die Datei besteht bereits. Ich möchte sie lediglich mit dem Openfiledialog auswählen. Die Datei wird im Dialog auch angezeigt. Wenn ich sie aber auswähle und dann OK drücke bekomme ich die Meldung dass sie nicht existiert. Das Selbe passiert auch wenn ich mit DirectoryInfo.getfiles den Ordner durchgehe. Dann Findet er auch die Datei, will ich mir jedoch die Attribute anzeigen lassen, sie löschen, umbenennen etc. findet er die Datei nicht. Nur wenn ich dann der Datei "\\?\" voranstelle geht es, aber die Möglichkeit habe ich beim Openfiledialog ja nicht.

    Hier der Pfad mit Dateiname:
    "F:\JDownloader Downloads\temp\temp\Carrie ist Peppa Wutz - Die Lackierwerkstatt von Tom dem Abschleppwagen _ Auto Cartoons für Kinder\Carrie ist Peppa Wutz - Die Lackierwerkstatt von Tom dem Abschleppwagen _ Auto Cartoons für Kinder (720p_30fps_H264-192kbit_AAC).mp4"
    @Humax ok:
    Der Dateiname ist zu lang, ich kann ihn gar nicht erstellen, er wird abgebrochen:
    Carrie ist Peppa Wutz - Die Lackierwerkstatt von Tom dem Abschleppwagen _ Auto Cartoons für Kinder (720p_30fps_H2
    Wie kann ich diese Datei erstellen, um danach den OFD-Test zu machen?
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich habe den Dateinamen nicht selbst erstellt. Habe die Datei aus dem Internet geladen. Deshalb ist der auch so lang...
    Aber man sollte mit einem Dateimanager, ich nutze SpeedCommander, auf beispielsweise Laufwerk d:\ Einfach eine .txt Datei erstellen können und der den langen Namen geben. Der Dateiname an sich hat ja "nur" knapp 140 Zeichen. Dann kann man auf Laufwerk "d:\" die Ordner erstellen (jdownloader downloads\temp\temp\Carrie ist Peppa Wutz - Die Lackierwerkstatt von Tom dem Abschleppwagen _ Auto Cartoons für Kinder). Und da die Datei reinkopieren. Sollte es Probleme geben wegen der länge kann man auch mit "Kommandozeile" ins Verzeichnis wechseln und die Datei hineinkopieren, bzw. erstellen. Oder mit VB Net mit Framework >4.6.1 (ich nutze 4.7.2) die Ordner / Datei erstellen mit vorangestelltem "\\?\"
    @Humax Diese Versuche hab ich bereits erfolöglos hinter mich gebracht.
    Ich empfehle Dir, den Pfad, einfach deutlich zu kürzen oder einem Laufwerksbuchstaben zuzuweisen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Also ich kann die Datei problemlos erstellen, sogar im Windows Explorer.
    Es geht ja darum den Dateinamen zu kürzen. Ich habe ja viele (und immer mal wieder neue dazu) dieser Dateien und manuelles Umbenennen ist sehr nervig und langsam. Deshalb geht das alles automatisch.
    Funktioniert ja auch soweit, das einzige Problem ist jetzt noch das ich im OFD die Dateien nicht auswählen kann. Und es interessiert mich wie bzw. ob das irgendwie zu lösen ist.
    Ich habe mal ein Archiv angehängt mit der Datei (leere Textdatei) und vollem Pfad. Also einfach auf Laufwerk D entpacken.
    Dateien
    Es ist schon etwas merkwürdig. Wenn man den OFD so einstellt, dass er weder die Existenz des Pfades noch der Datei prüfen soll, kommt man einen Schritt weiter. Aber auch nicht viel. Folgender Code ist ... verwirrend. Nicht inhaltlich, sondern von den Resultaten:

    VB.NET-Quellcode

    1. OpenFileDialog1.ShowDialog()
    2. If IO.File.Exists(OpenFileDialog1.FileName) Then Stop 'stoppt nicht
    3. Dim SelectedFileFromOfd = New IO.FileInfo(OpenFileDialog1.FileName)
    4. If SelectedFileFromOfd.Exists Then Stop 'stoppt nicht
    5. Dim Desktop = New IO.DirectoryInfo("C:\users\zed\desktop")
    6. Dim TheMysteriousFile = Desktop.EnumerateFiles("*.*", IO.SearchOption.AllDirectories)(3)
    7. If TheMysteriousFile.Exists Then Stop 'stoppt
    8. If SelectedFileFromOfd.FullName.ToUpper = TheMysteriousFile.FullName.ToUpper Then Stop 'stoppt auch

    SelectedFileFromOfd ist die Datei mit dem überlangen Namen, TheMysteriousFile ebenfalls. Nur eben auf unterschiedlichen Weg erhalten. FullName ist jeweils gleich. Doch einmal wird die Existenz bestätigt, einmal nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Moin, bin grad arbeiten , deshalb jetzt mein Aufruf aus dem Gedächtnis...Ich benutze den OFD wie folgt:

    VB.NET-Quellcode

    1. If OFD.Showdialog = Windows.DialogResult.OK then...

    Deshalb kann ich den Dialog mit der ausgewählten Datei nicht schließen.
    Konntest du @VaporiZed mit

    VB.NET-Quellcode

    1. OFD.Showdialog
    die Datei auswählen ohne dass er direkt danach wegen nicht existierender Datei meckert?
    @Humax Nimm nen FolderBrowserDialog und nenne den Pfad um.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Humax: Jup, klappt. Musst eben vorher beim OpenFileDialog das Überprüfen abstellen (CheckFileExists, CheckPathExists). Aber wie geschrieben, weiterhelfen kann es Dir wohl nicht viel.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    *unnötiges Vollzitat entfernt*

    Komisch, bei mir klappt es nicht. Auch wenn ich nur

    VB.NET-Quellcode

    1. ofd.showdialog
    mache wird sofort nach OK drücken gemeldet, dass die Datei nicht existiert und der Openfiledialog bleibt geöffnet...
    Weiterhelfen würde mir das schon, denn dann könnte ich den ofd.filename ja nach mit vorangestelltem "\\?\" benutzen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Sicherheitsfrage: Hast Du die Ofd-Eigenschaften CheckFileExists und CheckPathExists auf False gesetzt? Wer den Eingangspost lesen kann, ist klar im Vorteil. X/
    Schick mal bitte ein bereinigtes, abgespecktes Projekt, welches dieses Verhalten zeigt, hier per [Erweiterte Antwort] hoch.

    ##########

    Habe gerade festgestellt, dass man nur über die GetFiles/EnumerateFiles-Funktionen an die Datei kommt. Verwendet man den FullName als Parameter für IO.File.Exists oder zum Erstellen einer FileInfo-Instanz, klappt es nicht:

    VB.NET-Quellcode

    1. Private Sub StrangeFileBehavior()
    2. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then Stop
    3. If IO.File.Exists(OpenFileDialog1.FileName) Then Stop 'stoppt nicht
    4. Dim SelectedFileFromOfd = New IO.FileInfo(OpenFileDialog1.FileName)
    5. If SelectedFileFromOfd.Exists Then Stop 'stoppt nicht
    6. Dim Desktop = New IO.DirectoryInfo("C:\users\zed\desktop")
    7. Dim TheMysteriousFile = Desktop.GetFiles("*.*", IO.SearchOption.AllDirectories).Last
    8. If TheMysteriousFile.Exists Then Stop 'stoppt
    9. If IO.File.Exists(TheMysteriousFile.FullName) Then Stop 'stoppt nicht
    10. If New IO.FileInfo(TheMysteriousFile.FullName).Exists Then Stop 'stoppt nicht
    11. If SelectedFileFromOfd.FullName.ToUpper = TheMysteriousFile.FullName.ToUpper Then Stop 'stoppt
    12. End Sub


    ##########

    Und dementsprechend klappt es damit bei mir:

    VB.NET-Quellcode

    1. Private Sub StrangeFileBehavior()
    2. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then Stop
    3. If IO.File.Exists(OpenFileDialog1.FileName) Then Stop 'stoppt nicht
    4. Dim Desktop = New IO.DirectoryInfo("C:\users\zed\desktop")
    5. Dim TheMysteriousFile = Desktop.GetFiles(IO.Path.GetFileName(OpenFileDialog1.FileName), IO.SearchOption.AllDirectories).First
    6. If TheMysteriousFile.Exists Then Stop 'stoppt
    7. End Sub


    ##########

    Und dann eben noch allgemeiner:

    VB.NET-Quellcode

    1. Private Sub StrangeFileBehavior()
    2. OpenFileDialog1.ShowDialog()
    3. Dim ValidDirectoryName = GetFirstValidDirectoryNameFor(IO.Path.GetDirectoryName(OpenFileDialog1.FileName))
    4. Dim RootDirectory As New IO.DirectoryInfo(ValidDirectoryName)
    5. Dim TheMysteriousFile = RootDirectory.GetFiles(IO.Path.GetFileName(OpenFileDialog1.FileName), IO.SearchOption.AllDirectories).First
    6. If TheMysteriousFile.Exists Then Stop 'stoppt
    7. End Sub
    8. Private Function GetFirstValidDirectoryNameFor(CurrentPath As String) As String
    9. If IO.Directory.Exists(CurrentPath) Then Return CurrentPath
    10. Return GetFirstValidDirectoryNameFor(IO.Path.Combine("\..\", CurrentPath))
    11. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VaporiZed“ ()

    Da ich kein F:\ habe und zu faul bin es einzustellen, habe ich auf den Desktop geändern. Da ist der Pfad eh länger. Das Ergebnis bei beiden:
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Habe gerade festgestellt, dass nicht nur der OFD, sondern auch notepad und gar Windows selbst Probleme mit der Länge haben. Hatte Deine Datei auf'm Desktop (ging), dann auf nen Stick kopiert (ging nicht). Und dann wollte ich die Datei samt Ordner wieder auf den Desktop kopieren, da ich es vom Desktop runtergelöscht hatte. Und siehe da:

    obwohl die Datei da ist, laut Explorer.
    Bin jetzt nur gerade am Überlegen, ob das ggf. mit dem Stick zusammenhängt. Der ist zwar auch mit NTFS, aber wer weiß. Hab leider keine andere SSD/HDD, um den Gegentest zu machen. Auf welchem Typ Datenträger ist denn Deine Überlänge?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Die Datei ist auf ner NTFS formatierten über SATA anfeschlossenen Festplatte. Um die Datei da hin zu bekommen nutzte ich den normalen Windows explorer. Zuerst in einen "kurzen" Ordner die Datei erstellen. Dann die Ordnerstruktur erstellen. Die Datei kann dann in den "langen" Ordner kopiert oder verschoben werden.