当我选择的文件夹位于远程服务器上并且是符号链接(symbolic link)(或任何种类的重新解析点)时,FolderBrowserDialog的SelectedPath属性出现问题。
如果选择普通文件夹,则返回完整路径,例如“\SERVER\folder\subfolder\thing_I_clicked_on”。
但是,如果该文件夹是一个重新解析点,我只会得到“\SERVER\thing_I_clicked_on”(因此缺少完整路径)
var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
MessageBox.Show(dialog.SelectedPath);
有人遇到这个问题或有什么建议吗?它似乎与权限无关,好像我知道我可以很高兴地浏览到的完整路径,等等。
最佳答案
因此,我一直在对此进行大量调查,并认为我有答案。
首先,对我所看到的内容进行一些解释!
在服务器A上,有一个共享,其中包含一个指向服务器B上共享的符号链接(symbolic link):
\\serverA\Path\To\Folder
而目标是
\\serverB\Folder
实际发生的是,从
FolderBrowserDialog.SelectedPath
返回的值是\\serverB\Folder
,我错误地认为它缺少路径的一部分,因为字符串serverA和serverB非常相似!抱歉误导大家。我在此MSDN Example之后创建了自己的包装器,并注意到Shell32.dll函数
SHGetPathFromIDList
返回了重新解析点的目标,尽管该文档说我确实注意到之前的路径是正确的,所以在状态更改的回调方法中,我捕获了未翻译的所选路径
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
,这使我有很多工作要做。