65

我想编写一个可以向其传递文件路径的函数,例如:

C:\FOLDER\SUBFOLDER\FILE.TXT

它会使用包含该文件的文件夹打开 Windows 资源管理器,然后在该文件夹中选择该文件。(类似于许多程序中使用的“在文件夹中显示”概念。)

我怎样才能做到这一点?

4

4 回答 4

154

不使用 Win32 shell 函数的最简单方法是简单地使用/select参数启动 explorer.exe。例如,启动进程

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

将打开一个新的资源管理器窗口到 C:\Folder\subfolder 并选择 file.txt。

如果您希望在不启动新进程的情况下以编程方式执行此操作,则需要使用 shell 函数SHOpenFolderAndSelectItems,这是/selectexplorer.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;
}

参考:Explorer.exe 命令行开关

于 2012-12-03T09:35:53.500 回答
5

自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);
   }
}
于 2019-02-04T21:11:23.050 回答
4

执行命令时,如果路径包含多个斜杠,则不会打开文件夹并正确选择文件 请确保您的文件路径应如下所示

C:\a\b\x.txt

代替

C:\\a\\b\\x.txt

于 2014-12-04T06:42:41.360 回答
0

跟进@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 );
于 2019-07-03T08:23:00.667 回答