FolderBrowserDialog和“。”在路径名中

时间:2013-06-21 15:33:46

标签: c#

我使用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”,它将无法正常工作。它打开对话框,不返回任何错误,但卡在文件开发者的“根”(如果指定,否则为“桌面”)。

任何想法如何解决这个问题?因为它很烦人。

感谢您的帮助。

更新:在此帖子中由​​keyboardP解决:click me

1 个答案:

答案 0 :(得分:7)

Path.GetDirectoryName不知道您是否提供了带有点的文件夹或带扩展名的文件(例如,file.txt是文本文件还是文件夹?)。

如果您知道它是一个目录,那么解决方法可能是做这样的事情。

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

这可以确保GetDirectoryName知道它正在查看目录而不是文件,因为尾随\

根据评论更新了答案

此问题似乎FolderBrowserDialog具体(上述信息在其他情况下应该有效)。我能够重现你的问题,我设法找到一个相对hacky的解决方法,但它似乎是FolderBrowserDialog的错误,所以这应该足够了。

如果将RootFolder属性设置为包含您正在输入的路径的属性,则可以正常工作。例如,如果您将RootFolder设置为SpecialFolders.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();
}