2013-06-21 55 views
4

我面临一个问题,通过使用FolderBrowserDialog的fb.SelectedPath函数。 一切都很好,只要绝对路径不包含任何“。”。FolderBrowserDialog和“。”在路径名

例如:

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()的位置不包含任何条目,将用户导航到该文件夹​​ “”假设路径如下所示:“C:\ Prog” 但是,如果它返回一个带“。”的路径,就像“C:\ Prog.Test”一样,它不起作用。它打开对话框,返回没有错误,但在文件清理器的“根目录”(如果指定的话,否则它的“桌面”)中找到。

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

感谢您的帮助。

UPDATE:在这篇文章中解决了keyboardP:click me

+0

也许这里有一个系统的问题,因为我可以使用没有错误以下路径:'R:\文档\表\ my.folder \ another.dot.folder' – DonBoitnott

+0

@terrybozzio你不得不做例如:'Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly()。FullName)' – DonBoitnott

回答

7

Path.GetDirectoryName不知道你是否已经具备在其一个点或一个文件扩展名的文件夹(如为文件。 txt文本文件或文件夹?)。

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

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

这确保了GetDirectoryName知道它是在寻找一个目录,而不是在因为后\的文件。

更新的答案基于评论

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

如果将RootFolder属性设置为包含要输入的路径的属性,它将起作用。例如,如果您将RootFolder设置为,而您的输入为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(); 
} 
+1

+1指出GetDirectoryName()没有对输入做任何假设。 – DonBoitnott

+0

它不影响这种情况。因为它以编程方式在最后添加了一个子文件夹。它工作,如果路径不包含点,但它不,如果有的话。 使用另一个文件夹结构进行测试。只要内部没有点,它就会工作,并显示我想要的工作文件夹。 – Thyrador

+0

当我在家时,我会提供一个截图。只是为了显示问题,如果没关系。 – Thyrador