Определить все открытые системные / специальные папки

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

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

Environment.GetFolderPath(Environment.SpecialFolder.System))

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

Другие вопросы по тегам