【问题标题】:FolderBrowserDialog and "." in PathnameFolderBrowserDialog 和“。”在路径名中
【发布时间】:2013-06-21 15:33:46
【问题描述】:

我在使用 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

【问题讨论】:

  • 这里可能存在系统问题,因为我可以使用以下路径而不会出错:R:\Documents\Sheets\my.folder\another.dot.folder
  • @terrybozzio 你必须这样做:Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().FullName)

标签: c#


【解决方案1】:

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

如果您知道它是一个目录,解决方法可能是执行类似的操作。

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

这确保GetDirectoryName 知道它正在查看目录而不是文件,因为\ 的结尾。

根据 cmets 更新答案

这个问题似乎是FolderBrowserDialog 特定的(上述信息在其他情况下应该也可以)。我能够重现您的问题,并且设法找到了一个相对复杂的解决方法,但它似乎是 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();
}

【讨论】:

  • +1 指出 GetDirectoryName() 不对输入做任何假设。
  • 不影响情况。因为以编程方式它在最后添加了一个子文件夹。如果路径不包含点,它会起作用,但如果有,它不会。用另一个文件夹结构测试。只要里面没有点,它就可以工作并按照我的意愿显示工作文件夹。
  • 我会在我在家时提供屏幕截图。只是为了显示问题,如果可以的话。
  • @Thyrador - 抱歉,我不确定我是否关注。我已经更新了答案,以展示我的意思的一个例子。据我所知,这些是您想要的值吗?截图很好,发完后回复我,我知道再回来看看:)
  • 再一次。我可以使用那个文件夹,这不是问题。它只是不在对话窗口中显示。它停留在其根目录,并且不会导航到我之前设置的文件夹。在对话窗口之外,一切运行良好,我仍然可以使用该结构,即使里面有一个点。它只影响对话浏览器窗口本身
猜你喜欢
  • 1970-01-01
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多