2012-01-10 1 views
3

настоящее время я использую следующее 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 для компьютера?

+2

Одна из проблем, которые вы можете столкнуться, состоит в том, что не все окна исследователя связаны с пути. Например, в Windows 7 есть «Библиотеки», такие как «Документы» и «Музыка». Эти библиотеки представляют собой коллекции файлов и папок и не привязаны к точке файловой системы. –

+0

Поскольку, как указывали другие, некоторые «папки» не имеют * пути, возможно, если вы объясните, что вы планируете * делать * с этими путями, мы могли бы сделать некоторые предложения. –

+0

Я просто хочу определить открытые специальные папки и записать их в свое приложение – Elmo

ответ

0

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

Environment.GetFolderPath(Environment.SpecialFolder.System))

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

+0

@Programmer: используя этот метод, вы можете правильно определить «путь» открытого окна? – Tigran

+0

@Programmer: вы пытались использовать 'ShellWindowClass()' вместо 'ShellWndows()'? – Tigran

3

Вы должны использовать Environment.GetFolderPath(Environment.SpecialFolder) method

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

+0

вы можете сравнить 'j.LocationURL' с местоположениями специальных папок (как описано выше), чтобы увидеть, указывают ли некоторые из открытых окон проводника на специальную папку. – GolfWolf

+0

@Programmer: например, 'Environment.GetFolderPath (Environment.SpecialFolder.Desktop)' возвращает 'C: \ Users \ <текущее имя пользователя> \ Desktop', так что да, вы можете получить путь к специальным папкам (Program Files, Windows и т. Д.) – GolfWolf

+0

Теперь я понимаю, что такое настоящая проблема, и я не вижу надежного решения для этого. Я думал использовать комбинацию «FullName» (исполняемый путь) и «LocationName» (подпись) для идентификации таких папок (например, когда «ie.FullName == @» C: \ Windows \ Explorer.EXE «&& ie.LocationName ==« Компьютер »), но локализация приведет к сбою. – GolfWolf

0

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

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

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

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

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

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

+0

У них есть такие пути, как 'shell: MyComputerFolder' – Elmo

+0

@Programmer, это новый для меня; интересно (и круто). Но похоже, что это просто ярлык, который вы можете использовать в проводнике Windows; см., например, [Shell Commands Windows 7] (http://www.lancelhoff.com/shell-commands-windows-7/). Вы не можете войти в командную строку и набрать «cd shell: MyComputerFolder» или написать код, чтобы получить список каталогов; это просто удобство на уровне интерфейса. Основная ОС просто не имеет текстового имени для таких вещей, как Recycle Bin; он использует PIDL для идентификации объектов оболочки. И, к сожалению, похоже, что объекты InternetExplorer не имеют возможности получить PIDL. –

+0

Будет ли 'LocationName' работать для вас? Было бы достаточно отобразить в списке, но, вероятно, недостаточно хорошо, чтобы идентифицировать их программно. –