C# FolderBrowser对话框选择了带有重分析点的路径
当我选择的文件夹位于远程服务器上并且是符号链接(或任何类型的重分析点)时,FolderBrowserDialog的SelectedPath属性出现问题 如果选择普通文件夹,则返回完整路径,例如“\SERVER\folder\subfolder\thing\u i\u clicked\u on” 但是,如果文件夹是一个重分析点,我只会得到“\SERVER\thing\u我单击了”(因此它缺少完整路径) 有人遇到这个问题或有什么建议吗?它似乎与权限无关,好像我知道可以很愉快地浏览到它的完整路径,等等。链接必须在这里。是否确实需要完全的路径,而不是重分析点的路径?我想你可以用这条路代替。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我单击了”(因此它缺少完整路径) 有人遇到这个问题或有什么建议吗?它似乎与权限无关,好像我知道可以很愉快地浏览到它的完整路径,等等
“请注意,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
(我会努力获得一些“声誉”,这样我就可以对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;
}
}