6

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

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

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

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

有人遇到过这个或有什么建议吗?它似乎与权限无关,好像我知道完整路径我可以很高兴地浏览它,等等。

4

3 回答 3

2

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

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

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

\\serverA\Path\To\Folder

目标是

\\serverB\Folder

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

我在这个MSDN 示例之后创建了自己的包装器,并注意到 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;
                                    }
        }

所以SelectedFullPathProperty contains\\serverA\Path\To\FolderSelectedPathproperty contains \\ServerB\Folder,这让我有很多工作要做。

于 2012-09-19T10:34:15.510 回答
1

安迪的回答看起来会起作用,只是缺少细节,我不知道在哪里将他的代码片段添加到 MSDN 示例代码中。我可以让“MSDN 示例”代码工作,只是不知道在哪里溜进去安迪的东西。

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

使用 filedialog 类代替 browsefor 文件夹并设置;

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

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

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

于 2013-08-03T22:46:02.523 回答
1

如何以编程方式访问 Windows 符号链接的目标路径必须在此处。您确定您需要完全路径,而不是重新解析点的路径吗?我认为您可以改用此路径。“请注意,Windows 不支持连接到远程共享上的目录。” 证明

于 2012-09-17T06:09:22.643 回答