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


person Elmo    schedule 10.01.2012    source источник
comment
Одна проблема, с которой вы можете столкнуться, заключается в том, что не все окна проводника привязаны к пути. Например, в Windows 7 есть такие библиотеки, как «Документы» и «Музыка». Эти библиотеки представляют собой наборы файлов и папок и не имеют корня в точке файловой системы.   -  person Chris Haas    schedule 11.01.2012
comment
Поскольку, как указывали другие, некоторые папки не имеют имеют пути, возможно, если бы вы объяснили, что вы планируете делать с этими путями, мы могли бы внести некоторые предложения. .   -  person Damien_The_Unbeliever    schedule 11.01.2012
comment
Я просто хочу определить открытые специальные папки и записать их в свое приложение.   -  person Elmo    schedule 12.01.2012


Ответы (4)


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

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

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

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

person Cristian Lupascu    schedule 10.01.2012
comment
вы можете сравнить j.LocationURL с расположением специальных папок (определенных, как описано выше), чтобы увидеть, указывают ли некоторые открытые окна проводника на специальную папку. - person Cristian Lupascu; 11.01.2012
comment
@Programmer: например, Environment.GetFolderPath(Environment.SpecialFolder.Desktop) возвращает C:\Users\<current user name>\Desktop, так что да, можно получить путь к специальным папкам (Program Files, Windows и т. д.) - person Cristian Lupascu; 12.01.2012
comment
Теперь я понимаю, в чем реальная проблема, и я не вижу надежного решения для этого. Я думал об использовании комбинации FullName (путь к исполняемому файлу) и LocationName (заголовок) для идентификации таких папок (например, когда ie.FullName==@"C:\Windows\Explorer.EXE" && ie.LocationName=="Computer"), но из-за локализации это не удастся. - person Cristian Lupascu; 12.01.2012

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

person Elmo    schedule 12.01.2012

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

Environment.GetFolderPath(Environment.SpecialFolder.System))

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

person Tigran    schedule 10.01.2012
comment
@Programmer: используя этот метод, вы можете правильно определить path открытого окна? - person Tigran; 11.01.2012
comment
@Programmer: вы пытались использовать ShellWindowClass() вместо ShellWndows()? - person Tigran; 11.01.2012

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

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

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

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

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

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

person Joe White    schedule 10.01.2012
comment
У них есть такие пути, как shell:MyComputerFolder - person Elmo; 11.01.2012
comment
@Programmer, это новинка для меня; интересно (и круто). Но похоже, что это просто ярлык, который вы можете использовать в проводнике Windows; см. напр. Команды оболочки Windows 7. Вы не можете перейти в командную строку и набрать cd shell:MyComputerFolder или написать код, чтобы получить его список каталогов; это просто удобство на уровне пользовательского интерфейса. Базовая ОС просто не имеет текстового имени для таких вещей, как корзина; он использует PIDL для идентификации объектов оболочки. И, к сожалению, похоже, что объекты InternetExplorer не имеют способа получить PIDL. - person Joe White; 11.01.2012
comment
Подойдет ли вам LocationName? Было бы достаточно хорошо отображать их в списке, но, вероятно, недостаточно хорошо, чтобы идентифицировать их программно. - person Joe White; 11.01.2012