4

FolderBrowserDialog の fb.SelectedPath 関数を使用して問題に直面しています。絶対パスに「.」が含まれていない限り、すべて問題ありません。

例えば:

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; }

System.Reflection.Assembly.GetExecutingAssembly().Location に "." が含まれていない場合、ユーザーはそのフォルダーに移動します。パスが「C:\Prog」のようなものだとしましょう。しかし、「.」を含むパスが返される場合 その中で、「C:\Prog.Test」のように、それは動作しません。ダイアログが開き、エラーは返されませんが、filebroser の「ルート」で停止します (指定されている場合、そうでない場合は「デスクトップ」)。

その問題を解決する方法はありますか? かなりうるさいからです。

手伝ってくれてありがとう。

更新:この投稿のkeyboardPによって解決されました:クリックしてください

4

1 に答える 1

7

Path.GetDirectoryNameは、ドットが含まれるフォルダーまたは拡張子付きのファイルを提供したかどうかを認識していません (たとえば、file.txt はテキスト ファイルですか、それともフォルダーですか?)。

ディレクトリであることがわかっている場合、回避策は次のようにすることです。

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

これによりGetDirectoryName、末尾の\.

コメントに基づいて回答を更新

この問題はFolderBrowserDialog特定のもののようです (上記の情報は他の場合でも機能するはずです)。私はあなたの問題を再現することができ、比較的ハックな回避策を見つけることができましたが、それは のバグのFolderBrowserDialogようですので、これで十分です.

RootFolder入力しているパスを含むプロパティにプロパティを設定すると、機能します。たとえば、 を に設定しRootFolderSpecialFolders.MyDocuments入力がC:\...\My Documents\test.dot.folderである場合、動作するはずです。したがって、回避策はSpecialFolders列挙型を繰り返し処理し、最初の一致を設定します。

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

   //find closest SpecialFolder that matches the input (can be expanded to not be case-sensitive)
   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();
}
于 2013-06-21T15:44:19.587 に答える