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