FolderBrowserDialog具有重新分析点的SelectedPath

时间:2012-09-05 13:28:22

标签: c# .net winforms .net-4.0

当我选择的文件夹位于远程服务器上并且是符号链接(或任何类型的重新分析点)时,我遇到了FolderBrowserDialog的SelectedPath属性的问题。

如果我选择了普通文件夹,那么我会返回完整路径,例如“\ SERVER \ folder \ subfolder \ thing_I_clicked_on”。

但是,如果文件夹是重新分析点,我只会得到“\ SERVER \ thing_I_clicked_on”(所以它缺少完整路径)

var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
MessageBox.Show(dialog.SelectedPath);

有人遇到此或有任何建议吗?它似乎与权限无关,就好像我知道完整路径我可以很乐意浏览它等等。

3 个答案:

答案 0 :(得分:2)

所以,我一直在调查这个问题,并且认为我有一个答案。

首先,对我所看到的内容进行一些解释!

在服务器A上,有一个共享,其中包含指向服务器B上共享的符号链接:

\\serverA\Path\To\Folder

,目标是

\\serverB\Folder

实际发生的是,FolderBrowserDialog.SelectedPath返回的值是\\serverB\Folder,我错误地认为它缺少部分路径,因为字符串serverA和serverB非常相似!很抱歉误导所有人。

我在MSDN Example之后创建了自己的包装器,并注意到Shell32.dll函数SHGetPathFromIDList正在返回重新分析点的目标,尽管文档说明了

  

如果pidl参数指定了快捷方式,则pszPath将包含   快捷方式的路径,而不是快捷方式的目标

我确实注意到之前的路径是正确的,所以在我的回调方法中,当状态改变时,我捕获了未翻译的选定路径

private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData)
        {
            switch (msg)
            {
                 case BrowseForFolderMessages.BffmSelchanged:
                     if (haveValidPath && !String.IsNullOrEmpty(displayedPath))
                                {
                                    if (IntPtr.Zero != _hwndEdit)
                                    {
                                        SelectedFullPath = displayedPath;
                                    }
        }

因此SelectedFullPath属性包含\\serverA\Path\To\FolderSelectedPath属性包含\\ServerB\Folder,这让我有很多工作要做。

答案 1 :(得分:1)

How do I programmatically access the target path of a windows symbolic链接必须在这里。你确定你需要完全完整的路径,而不是重新分析点的路径吗?我想你可以改用这条路径。 “请注意,Windows不支持远程共享目录的联结。” proof

答案 2 :(得分:1)

Andy的回答看起来会起作用,除了缺少细节,我无法弄清楚将他的代码片段添加到MSDN示例代码的位置。我可以使用“MSDN示例”代码来工作,只是不知道Andy的东西在哪里。

所以...对于那些像我这样无法弄清楚如何处理上述代码的人,(我真的希望我知道我在做什么;)这是一种蹩脚的解决方案。

使用filedialog类代替browseforfolder并设置;

  • DereferenceLinks Property = false
  • CheckFileExists = false
  • filename =一个虚假的默认文件名。 (让用户知道文件名是什么并不重要,因为他们只是选择一个文件夹。)
  • 使用OpenFileDialog或SaveFileDialog。

请注意,完成此操作后,如果用户点击旧式Windows快捷方式(* .lnk),它(快捷方式)将作为文件名返回,因此您必须考虑到这一点。

希望这有助于;) (我会努力获得一些“声望”,所以我可以评论Andy的帖子,以获得他的答案的详细信息,因为它看起来非常好。)