Solución:
La forma más sencilla sin utilizar las funciones de shell de Win32 es simplemente iniciar explorer.exe con el /select
parámetro. Por ejemplo, iniciar el proceso
explorer.exe /select,"C:Foldersubfolderfile.txt"
abrirá una nueva ventana del explorador en C: Carpeta subcarpeta con file.txt seleccionado.
Si desea hacerlo mediante programación sin iniciar un nuevo proceso, deberá usar la función de shell SHOpenFolderAndSelectItems
, que es lo que /select
comando para explorer.exe se utilizará internamente. Tenga en cuenta que esto requiere el uso de PIDL y puede ser un PITA real si no está familiarizado con el funcionamiento de las API de shell.
A continuación, se muestra una implementación programática completa del /select
enfoque, con limpieza de ruta gracias a las sugerencias de @Bhushan y @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;
}
Referencia: modificadores de la línea de comandos Explorer.exe
Al ejecutar el comando, si su ruta contiene varias barras, no abrirá la carpeta y no seleccionará el archivo correctamente.Asegúrese de que la ruta del archivo sea así.
C: a b x.txt
en lugar de
C: \ a \ b \ x.txt
los soportado ya que Windows XP (es decir, no es compatible con Windows 2000 o anterior) es 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);
}
}