Как открыть проводник с выбранным конкретным файлом?

Я хотел бы закодировать функцию, в которую вы можете передать путь к файлу, например:

  C:  FOLDER  SUBFOLDER  FILE.TXT  

, и он откроет проводник Windows с папкой, содержащей файл, а затем выберет этот файл внутри папки. (Подобно концепции «Показать в папке», используемой во многих программах.)

Как я могу это сделать?


Самый простой способ без использования Win32 Функции оболочки — просто запустить explorer.exe с параметром /select . Например, запуск процесса

explorer.exe/select,"C:Foldersubfolderfile.txt "

откроет новое окно проводника в C: Folder subfolder с выбранным файлом file.txt.

Если вы хотите сделать это программно, не запуская новый процесс, вам нужно будет использовать оболочку function SHOpenFolderAndSelectItems , который команда /select для explorer.exe будет использовать для внутренних целей. Обратите внимание, что это требует использования PIDL и может быть настоящим PITA, если вы не знакомы с тем, как работают API оболочки.

Вот полная программная реализация / выбор с очисткой пути благодаря предложениям @Bhushan и @tehDorf:

  public bool ExploreFile (string filePath) {if (! System.IO.File  .Exists (filePath)) {вернуть ложь;  }//Очищаем путь к файлу, чтобы по нему можно было перемещаться OK filePath = System.IO.Path.GetFullPath (filePath);  System.Diagnostics.Process.Start ("explorer.exe", string.Format ("/select, " {0}  "", filePath));  return true;}  

Ссылка: переключатели командной строки Explorer.exe


Метод , поддерживаемый , начиная с Windows XP (т. е. не поддерживается в Windows 2000 или более ранних версиях), — это SHOpenFolderAndSelectItems :

  void OpenFolderAndSelectItem (String filename) {//Разобрать полное имя файла в pidl PIDLIST_ABSOLUTE pidl;  Флаги SFGAO;  SHParseDisplayName (имя файла, ноль, выходной идентификатор, 0, флаги выхода);  попробуйте {//Откройте проводник и выберите объект SHOpenFolderAndSelectItems (pidl, 0, null, 0);  } finally {//Используйте распределитель задач, чтобы освободить возвращенный pidl CoTaskMemFree (pidl);  }}  


поддерживаемый метод, начиная с Windows XP (т.е.. не поддерживается в Windows 2000 или более ранних версиях) — SHOpenFolderAndSelectItems :

  void OpenFolderAndSelectItem (String filename) {//Разбираем полное имя файла в pidl  PIDLIST_ABSOLUTE pidl;  Флаги SFGAO;  SHParseDisplayName (имя файла, ноль, выходной идентификатор, 0, флаги выхода);  попробуйте {//Откройте проводник и выберите объект SHOpenFolderAndSelectItems (pidl, 0, null, 0);  } finally {//Используйте распределитель задач, чтобы освободить возвращенный pidl CoTaskMemFree (pidl);  }}  

Если при выполнении команды ваш путь содержит несколько косых черт, он не откроется папку и выберите файл правильно. Убедитесь, что путь к вашему файлу должен быть таким

C: a b x.txt

вместо

C: \ a \ b \ x.txt


При выполнении команды, если ваш путь содержит несколько косых черт, тогда он не откроет папку и не выберет файл правильно. Убедитесь, что ваш путь к файлу должен быть таким

C: a b x.txt

вместо

C: \ a \ b \ x.txt


Чтобы продолжить ответ @Mahmoud Al-Qudsi. когда он говорит «запуск процесса», это то, что у меня сработало:

 //предполагаем, что переменная "path" имеет полный путь к файлу, но, возможно, с/разделителями для  (int я = 0; путь [я]! = 0; я ++) {если (путь [я] == '/') {путь [я] = '\';  }} std :: string s = "explorer.exe/select, " "; s + = path; s + ="  ""; PROCESS_INFORMATION processInformation; STARTUPINFOA startupInfo; ZeroMemory (& startupInfo, sizeof (startupInfo)); startupInfo.  cb = sizeof (STARTUPINFOA); ZeroMemory (& processInformation, sizeof (processInformation)); CreateProcessA (NULL, (LPSTR) s.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, & startupInfo, & processInformation);  


Чтобы продолжить ответ @Mahmoud Al-Qudsi. когда он говорит «запуск процесса», это то, что у меня сработало:

 //предполагаем, что переменная "path" имеет полный путь к файлу, но, возможно, с/разделителями для  (int я = 0; путь [я]! = 0; я ++) {если (путь [я] == '/') {путь [я] = '\';  }} std :: string s = "explorer.exe/select, " "; s + = path; s + ="  ""; PROCESS_INFORMATION processInformation; STARTUPINFOA startupInfo; ZeroMemory (& startupInfo, sizeof (startupInfo)); startupInfo.  cb = sizeof (STARTUPINFOA); ZeroMemory (& processInformation, sizeof (processInformation)); CreateProcessA (NULL, (LPSTR) s.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, & startupInfo, & processInformation);  

Оцените статью
techsly.ru
Добавить комментарий