C# FolderBrowser对话框选择了带有重分析点的路径

C# FolderBrowser对话框选择了带有重分析点的路径,c#,.net,winforms,.net-4.0,C#,.net,Winforms,.net 4.0,当我选择的文件夹位于远程服务器上并且是符号链接(或任何类型的重分析点)时,FolderBrowserDialog的SelectedPath属性出现问题 如果选择普通文件夹,则返回完整路径,例如“\SERVER\folder\subfolder\thing\u i\u clicked\u on” 但是,如果文件夹是一个重分析点,我只会得到“\SERVER\thing\u我单击了”(因此它缺少完整路径) 有人遇到这个问题或有什么建议吗?它似乎与权限无关,好像我知道可以很愉快地浏览到它的完整路径,等等

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

如果选择普通文件夹,则返回完整路径,例如“\SERVER\folder\subfolder\thing\u i\u clicked\u on”

但是,如果文件夹是一个重分析点,我只会得到“\SERVER\thing\u我单击了”(因此它缺少完整路径)

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

链接必须在这里。是否确实需要完全的路径,而不是重分析点的路径?我想你可以用这条路代替。
“请注意,Windows不支持远程共享上的目录连接。”

因此,我已经对此进行了大量研究,并认为我已经找到了答案

首先,我要解释一下我看到了什么

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

\\serverA\Path\To\Folder
其目标是

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

我创建了自己的包装器,并注意到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\Folder
SelectedPath
属性包含
\\ServerB\Folder
,这让我有很多工作要做。

Andy的答案看起来很有用,只是缺少细节,我不知道在哪里可以将他的代码片段添加到MSDN示例代码中。我可以让“MSDN示例”代码正常工作,只是不知道把安迪的东西放在哪里

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

使用filedialog类代替browseforfolder并设置

  • 解引用链接属性=false
  • CheckFileExists=false
  • filename=伪造的默认文件名。(让用户知道,文件名是什么并不重要,因为他们只是在选择一个文件夹。)
  • 使用OpenFileDialog或SaveFileDialog
请注意,完成此操作后,如果用户单击老式的windows快捷方式(*.lnk),它(快捷方式)将作为文件名返回,因此您必须对此进行说明

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

你是以管理员的身份运行这个程序还是什么的?可能是一些UNC的东西正在发生…我不确定,但这是我的想法作为管理员运行没有任何区别,我担心:(嗨-无论是完整的还是相对的,我确实需要整个路径,这不是我得到的。感谢链接-windows绝对允许到远程目录的符号链接(连接和符号链接都是重分析点,但不相同):mklink/D C:\blah\\server\path\to\blahHa!看起来答案如下:
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;
                                    }
        }