当我选择的文件夹位于远程服务器上并且是符号链接(或任何类型的重新分析点)时,我遇到了FolderBrowserDialog的SelectedPath属性的问题。
如果我选择了普通文件夹,那么我会返回完整路径,例如“\ SERVER \ folder \ subfolder \ thing_I_clicked_on”。
但是,如果文件夹是重新分析点,我只会得到“\ SERVER \ thing_I_clicked_on”(所以它缺少完整路径)
var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
MessageBox.Show(dialog.SelectedPath);
有人遇到此或有任何建议吗?它似乎与权限无关,就好像我知道完整路径我可以很乐意浏览它等等。
答案 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\Folder
和SelectedPath
属性包含\\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并设置;
请注意,完成此操作后,如果用户点击旧式Windows快捷方式(* .lnk),它(快捷方式)将作为文件名返回,因此您必须考虑到这一点。
希望这有助于;) (我会努力获得一些“声望”,所以我可以评论Andy的帖子,以获得他的答案的详细信息,因为它看起来非常好。)