Определить все открытые системные / специальные папки - PullRequest
3 голосов
/ 11 января 2012

В настоящее время я использую следующее для Получить путь в ListBox всех Open Explorer Windows :

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

Но он не возвращает местоположение специальных папок, таких как Компьютер,Корзина, сеть и т. Д. Есть ли способ идентифицировать эти папки, чтобы я мог самостоятельно указать путь, например shell:MyComputerFolder для компьютера?

Ответы [ 4 ]

3 голосов
/ 11 января 2012

Вам необходимо использовать Environment.GetFolderPath (Environment.SpecialFolder) метод

Environment.SpecialFolder - это перечисление со значениями для всех «специальных» папок Windows (например, «Мои документы»Program Files, Desktop)

Обновление: Вы можете использовать этот метод, чтобы определить, является ли данный путь специальной папкой:

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, чтобы узнать, какие из открытых папок являются специальными папками.

1 голос
/ 12 января 2012

Если j.LocationName было null Я сравнил его с именем текущей системной папки: Получить текущие имена специальных папок Windows , затем вручную добавил путь, например shell:MyComputerFolder

0 голосов
/ 11 января 2012

Мне нужно получить путь ... Но он не возвращает местоположение специальных папок, таких как Компьютер, Корзина, Сеть и т. Д.

Непосредственная проблема, с которой вы сталкиваетесь, заключается в том, что LocationURL возвращает "", если местоположение окна не является физическим каталогом. Для «Моего компьютера», «Корзины» и «Сети» это неудивительно - это виртуальные папки; - это не путь или URL, которые могут указывать на них, потому что они не расположены на диске.

Однако, если вы перейдете к «Документам» (что соответствует каталогу на диске, даже если это также специальная папка), LocationURL по-прежнему возвращает "". Здесь он может дать вам путь, но он решает не делать этого. Это кажется несколько подлым.

Я нашел документацию, в которой говорится, что ShellWindows возвращает InternetExplorer объектов . Я не смог найти никаких документов для класса ShellBrowserWindow, который вы используете, но InternetExplorer кажется похожим или идентичным, поэтому у него есть некоторая документация , на которую вы можете сослаться, а не просто смотреть на имена свойств в Intellisense.

Единственное другое полезное свойство - LocationName, которое возвращает что-то даже для виртуальных или специальных папок. Тем не менее, он возвращает строку типа «Документы» или «Библиотеки», которую вы не можете использовать программно (в разных регионах, в разных версиях Windows и т. Д.).

Если все, что вам нужно, это что-то показать в списке, LocationName, вероятно, будет достаточно. Если вам действительно нужен путь, вам, вероятно, не повезло (хотя в любом случае это было бы так, потому что, как отмечалось, такие вещи, как компьютер, корзина и сеть, не имеют путей).

0 голосов
/ 11 января 2012

Можно использовать Environment.SpecialFolder перечисление, подобное этому

Environment.GetFolderPath(Environment.SpecialFolder.System))

В ссылке, кстати, есть конкретный пример кода.

...