我想编写一个可以向其传递文件路径的函数,例如:
C:\FOLDER\SUBFOLDER\FILE.TXT
它会使用包含该文件的文件夹打开 Windows 资源管理器,然后在该文件夹中选择该文件。(类似于许多程序中使用的“在文件夹中显示”概念。)
我怎样才能做到这一点?
不使用 Win32 shell 函数的最简单方法是简单地使用/select
参数启动 explorer.exe。例如,启动进程
explorer.exe /select,"C:\Folder\subfolder\file.txt"
将打开一个新的资源管理器窗口到 C:\Folder\subfolder 并选择 file.txt。
如果您希望在不启动新进程的情况下以编程方式执行此操作,则需要使用 shell 函数SHOpenFolderAndSelectItems
,这是/select
explorer.exe 的命令将在内部使用的。请注意,这需要使用 PIDL,如果您不熟悉 shell API 的工作原理,它可以是真正的 PITA。
这是该方法的完整的程序化实现,/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;
}
自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);
}
}
执行命令时,如果路径包含多个斜杠,则不会打开文件夹并正确选择文件 请确保您的文件路径应如下所示
C:\a\b\x.txt
代替
C:\\a\\b\\x.txt
跟进@Mahmoud Al-Qudsi 的回答。当他说“启动流程”时,这对我有用:
// 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 );