4 Stimmen

FolderBrowserDialog und "." im Pfadname

Ich habe ein Problem bei der Verwendung der fb.SelectedPath-Funktion des FolderBrowserDialog.

Alles läuft gut, solange der absolute Pfad kein "." enthält.

Zum Beispiel:

try
{
    if (arg == 1)
        fb_dialog.SelectedPath = Path.GetFullPath(tb_path.Text);
    else
        fb_dialog.SelectedPath = Path.GetFullPath(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
}
catch { fb_dialog.RootFolder = System.Environment.SpecialFolder.MyComputer; }

Wenn System.Reflection.Assembly.GetExecutingAssembly().Location kein "." enthält, wird der Benutzer in diesem Ordner navigiert. Angenommen, der Pfad sieht so aus: "C:\Prog" Aber wenn er einen Pfad mit einem "." zurückgibt, wie "C:\Prog.Test", funktioniert es nicht. Es öffnet den Dialog, gibt keine Fehler zurück, bleibt aber im "Root"-Verzeichnis des Dateibrowsers stecken (falls angegeben, andernfalls ist es "Desktop").

Irgendwelche Ideen, wie man dieses Problem lösen kann? Weil es ziemlich nervig ist.

Danke für die Hilfe.

UPDATE: Gelöst von keyboardP in diesem Beitrag: Hier klicken

7voto

keyboardP Punkte 67673

Path.GetDirectoryName weiß nicht, ob Sie einen Ordner mit einem Punkt angegeben haben oder eine Datei mit einer Erweiterung (z.B. ist file.txt eine Textdatei oder ein Ordner?).

Wenn Sie wissen, dass es sich um ein Verzeichnis handelt, könnte ein Workaround so aussehen.

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location + "\\")

Dies stellt sicher, dass GetDirectoryName darauf aufmerksam gemacht wird, dass es sich um ein Verzeichnis handelt und nicht um eine Datei aufgrund des nachgestellten \.

Aktualisierte Antwort basierend auf Kommentaren

Dieses Problem scheint spezifisch für FolderBrowserDialog zu sein (die obigen Informationen sollten in anderen Fällen funktionieren). Ich konnte Ihr Problem reproduzieren und es ist mir gelungen, einen relativ schlampigen Workaround zu finden, aber es scheint sich um einen Fehler im FolderBrowserDialog handeln, daher sollte dies ausreichen.

Wenn Sie die RootFolder-Eigenschaft auf einen Pfad setzen, der den eingegebenen Pfad enthält, funktioniert es. Wenn Sie beispielsweise die RootFolder-Eigenschaft auf SpecialFolders.MyDocuments setzen und Ihr Eingabe C:\...\My Documents\test.dot.folder ist, sollte es funktionieren. Daher durchläuft der Workaround das SpecialFolders-Enum und setzt das erste Übereinstimmung.

using (FolderBrowserDialog fbd = new FolderBrowserDialog())
{
   fbd.SelectedPath = Path.GetFullPath(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));

   //finde den nächstgelegenen SpecialFolder, der mit der Eingabe übereinstimmt (kann erweitert werden, um nicht auf die Groß- und Kleinschreibung zu achten)
   foreach (var sf in Enum.GetValues(typeof(Environment.SpecialFolder)))
   {
       string spath = Environment.GetFolderPath((Environment.SpecialFolder)sf);
       if (fbd.SelectedPath.Contains(spath))
       {
           fbd.RootFolder = (Environment.SpecialFolder)sf;
           break;
       }
   }

   fbd.ShowDialog();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X