【问题标题】:Identify all open System/Special Folders识别所有打开的系统/特殊文件夹
【发布时间】:2012-01-10 21:15:14
【问题描述】:

我目前正在使用以下Get Path in a ListBox of all Open Explorer Windows

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

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

【问题讨论】:

  • 您可能遇到的一个问题是并非所有资源管理器窗口都绑定到路径。例如,在 Windows 7 中,有诸如“文档”和“音乐”之类的“库”。这些库是文件和文件夹的集合,并不植根于文件系统点。
  • 因为,正如其他人所指出的那样,一些“文件夹”没有路径,也许如果你解释了你打算做什么 通过这些路径,我们可以提出一些建议。
  • 我只是想识别打开的特殊文件夹并将它们记录在我的应用程序中

标签: c# .net vb.net shdocvw


【解决方案1】:

您需要使用Environment.GetFolderPath(Environment.SpecialFolder) method

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;
}

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

【讨论】:

  • 您可以将j.LocationURL 与特殊文件夹的位置(如上所述确定)进行比较,以查看某些打开的资源管理器窗口是否指向特殊文件夹。
  • @Programmer:例如Environment.GetFolderPath(Environment.SpecialFolder.Desktop)返回C:\Users\<current user name>\Desktop,所以是的,可以获取特殊文件夹(Program Files、Windows等)的路径
  • 现在我明白真正的问题是什么,但我看不到可靠的解决方案。我一直在考虑使用FullName(可执行路径)和LocationName(标题)的组合来识别此类文件夹(例如,当ie.FullName==@"C:\Windows\Explorer.EXE" && ie.LocationName=="Computer" 时),但是本地化会使这个失败。
【解决方案2】:

如果j.LocationNamenull 我将它与当前系统文件夹的名称进行比较:Get Current Names of Windows Special Folders,然后像shell:MyComputerFolder 一样手动添加路径

【讨论】:

    【解决方案3】:

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

    Environment.GetFolderPath(Environment.SpecialFolder.System))

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

    【讨论】:

    • @Programmer: 使用那个方法你可以找出打开窗口的path 正确吗?
    • @Programmer:你有没有尝试使用ShellWindowClass()而不是ShellWndows()
    【解决方案4】:

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

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

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

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

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

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

    【讨论】:

    • 他们确实有像shell:MyComputerFolder这样的路径
    • @Programmer,这对我来说是新的;有趣(而且很酷)。但看起来这只是您可以在 Windows 资源管理器中使用的快捷方式;参见例如Shell Commands Windows 7。您不能进入命令提示符并键入“cd shell:MyComputerFolder”,或者编写代码来获取它的目录列表;这只是 UI 级别的便利。底层操作系统根本没有像回收站这样的文本名称;它使用 PIDL 来识别 shell 对象。不幸的是,InternetExplorer 对象似乎无法获取 PIDL。
    • LocationName 会为您工作吗?显示在列表中就足够了,但可能不足以以编程方式识别它们。
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多