3

我目前正在使用以下内容在所有 Open Explorer Windows 的 ListBox 中获取路径

foreach (SHDocVw.InternetExplorer j in new SHDocVw.ShellWindows()) {
    if (j.Name == "Windows Explorer") {
        ListView1.Items.Add(j.LocationURL);
    }
}

但它不会返回计算机、回收站、网络等特殊文件夹的位置。有没有办法识别这些文件夹,这样我就可以像shell:MyComputerFolder计算机一样将路径放在我自己的位置上?

4

4 回答 4

3

您需要使用Environment.GetFolderPath(Environment.SpecialFolder) 方法

Environment.SpecialFolder 是一个枚举,它包含所有 Windows“特殊”文件夹(例如我的文档、程序文件、桌面)的值

更新: 您可以使用此方法来判断给定路径是否是特殊文件夹:

public static bool IsSpecialFolder(string folderPath)
{
    foreach (Environment.SpecialFolder specialFolderType in Enum.GetValues(typeof (Environment.SpecialFolder)))
    {
        var specialFolderLocation = Environment.GetFolderPath(specialFolderType);

        if(specialFolderLocation.Equals(folderPath, StringComparison.InvariantCultureIgnoreCase))
            return true;
    }

    return false;
}

例如,您可以调用IsSpecialFolder(j.LocationURL)每个j文件夹以找出哪些打开的文件夹是特殊文件夹。

于 2012-01-10T21:19:07.050 回答
1

如果我将它与当前系统文件夹的名称进行比较:j.LocationName获取Windows 特殊文件夹的当前名称,然后手动添加路径,如nullshell:MyComputerFolder

于 2012-01-12T19:04:37.837 回答
0

可以像这样使用Environment.SpecialFolder枚举

Environment.GetFolderPath(Environment.SpecialFolder.System))

顺便说一下,在链接中,有一个具体的代码示例。

于 2012-01-10T21:18:30.173 回答
0

我需要获取路径...但它不会返回特殊文件夹(如计算机、回收站、网络等)的位置。

您遇到的直接问题是,如果窗口的位置不是物理目录,LocationURL则会返回。""对于“我的电脑”、“回收站”和“网络”,这并不奇怪——它们是虚拟文件夹;没有可以指向它们的路径或 URL,因为它们不是磁盘上的位置。

但是,如果您导航到“文档”(它确实对应于磁盘上的一个目录,即使它也是一个特殊文件夹),LocationURL仍然会返回"". 在这里,它可以为您提供一条路径,但它选择不这样做。这似乎有些刻薄。

我发现一些文档说ShellWindows返回InternetExplorerobjects。我找不到ShellBrowserWindow您正在使用的类的任何文档,但InternetExplorer似乎相似或相同,因此它有一些文档可供您参考,而不必只查看 Intellisense 中的属性名称。

唯一看起来有用的其他属性是LocationName,即使对于虚拟或特殊文件夹,它也会返回一些东西。但是,它会返回一个类似“Documents”或“Libraries”的字符串,这不是您可以真正以编程方式使用的字符串(它在不同的语言环境、不同的 Windows 版本等中会有所不同)

如果您只需要在列表中显示一些内容,LocationName那可能就足够了。如果您确实需要该路径,那么您可能不走运(尽管无论如何您都会遇到,因为如前所述,计算机、回收站和网络之类的东西没有路径)。

于 2012-01-10T23:11:12.740 回答