Подтвердить что ты не робот

Как открыть Explorer с выбранным файлом?

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

C:\FOLDER\SUBFOLDER\FILE.TXT

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

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

4b9b3361

Ответ 1

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

explorer.exe/select,"C:\Folder\subfolder\file.txt"

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

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

Здесь полная программная реализация подхода /select с очисткой пути благодаря предложениям @Bhushan и @tehDorf:

public bool ExploreFile(string filePath) {
    if (!System.IO.File.Exists(filePath)) {
        return false;
    }
    //Clean up file path so it can be navigated OK
    filePath = System.IO.Path.GetFullPath(filePath);
    System.Diagnostics.Process.Start("explorer.exe", string.Format("/select,\"{0}\"", filePath));
    return true;
}

Ссылка: Explorer.exe Командная строка

Ответ 2

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

C:\A\B\x.txt

вместо

С:\\а\\Ь\\x.txt

Ответ 3

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

void OpenFolderAndSelectItem(String filename)
{
   // Parse the full filename into a pidl
   PIDLIST_ABSOLUTE pidl;
   SFGAO flags;
   SHParseDisplayName(filename, null, out pidl, 0, out flags);
   try 
   {
      // Open Explorer and select the thing
      SHOpenFolderAndSelectItems(pidl, 0, null, 0);
   }
   finally 
   {
      // Use the task allocator to free to returned pidl
      CoTaskMemFree(pidl);
   }
}

Ответ 4

Чтобы ответить на @Mahmoud Аль-Кудси ответ. когда он говорит "запуск процесса", это то, что работает для меня:

// assume variable "path" has the full path to the file, but possibly with / delimiters
for ( int i = 0 ; path[ i ] != 0 ; i++ )
{
    if ( path[ i ] == '/' )
    {
        path[ i ] = '\\';
    }
}
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 );