Как открыть Explorer с выбранным файлом?
Я хотел бы закодировать функцию, к которой вы можете передать путь к файлу, например:
C:\FOLDER\SUBFOLDER\FILE.TXT
и он откроет проводник Windows с папкой, содержащей файл, а затем выберите этот файл внутри папки. (Подобно концепции "Показывать в папке", используемой во многих программах.)
Как я могу это сделать?
Ответы
Ответ 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 );