2012-02-23 9 views
14

¿Cómo se obtiene el destino del directorio de una carpeta de acceso directo? Busqué en todas partes y solo encuentro el objetivo del archivo de acceso directo.Obtiene el destino de la carpeta de acceso directo

+1

esto no se relaciona con WPF en absoluto, me quita la etiqueta –

+0

Este es el solución que prefiero: [¿Cómo obtengo el nombre de ruta de un acceso directo a archivos?] (http://stackoverflow.com/a/13079688/3757210) – ilcorvo

Respuesta

22

creo que tendrá que utilizar COM y agregar una referencia a "Control de Shell Microsoft y automatización", como se describe en this blog post:

Aquí hay un ejemplo usando el código siempre que:

namespace Shortcut 
{ 
    using System; 
    using System.Diagnostics; 
    using System.IO; 
    using Shell32; 

    class Program 
    { 
     public static string GetShortcutTargetFile(string shortcutFilename) 
     { 
      string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename); 
      string filenameOnly = System.IO.Path.GetFileName(shortcutFilename); 

      Shell shell = new Shell(); 
      Folder folder = shell.NameSpace(pathOnly); 
      FolderItem folderItem = folder.ParseName(filenameOnly); 
      if (folderItem != null) 
      { 
       Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
       return link.Path; 
      } 

      return string.Empty; 
     } 

     static void Main(string[] args) 
     { 
      const string path = @"C:\link to foobar.lnk"; 
      Console.WriteLine(GetShortcutTargetFile(path)); 
     } 
    } 
} 
+0

¡Gracias! Ahora solo tengo que averiguar cómo buscar una carpeta shortcuf programmaticaly :) –

+2

Trabajo en Windows 7 64 bit, y falla al encontrar acceso directo a VirtualBox instalado en 'C: \ Program Files \ Oracle \ VirtualBoxOSX'. Siguió devolviendo el objetivo para estar en 'C: \ Archivos de programa (x86) \ Oracle \ VirtualBoxOSX \ VirtualBox.exe'. ¿Alguna explicación sobre este comportamiento? – swdev

+0

El uso de Shell32 con este método solo permite la aplicación de un solo hilo. Debe incluir [STAThread] en el punto de entrada principal. Obtendrá excepción en las pruebas unitarias con este código porque la prueba unitaria no permite STAThread. ver [respuesta] (http://stackoverflow.com/questions/14543340/calling-shell32-dll-from-net-windows-service). También hay una solución para ejecutar este código en pruebas unitarias. Consulte http://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn

-2

Todos los accesos directos a archivos tienen una extensión de archivo .lnk que puede verificar. Usando una cadena por ejemplo, puede usar string.EndsWith (". Lnk") como un filtro.

Todos los accesos directos de URL tienen una extensión de archivo .url, por lo que tendrá que tenerlos en cuenta si es necesario.

+1

. OP preguntó cómo obtener el directorio de destino del acceso directo, no cómo hacerlo. comprueba si es un atajo. –

0

si quiere encontrar su ruta de la aplicación que ha de acceso directo en el escritorio, una manera fácil de que yo uso, es el siguiente:

Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\") 

este código de retorno de cualquier camino exe que ejecuta, independientemente de que quien solicita el archivo

1

Una forma aún más simple para obtener la ruta vinculada que yo uso es:

private static string LnkToFile(string fileLink) 
{ 
    string link = File.ReadAllText(fileLink); 
    int i1 = link.IndexOf("DATA\0"); 
    if (i1 < 0) 
     return null; 
    i1 += 5; 
    int i2 = link.IndexOf("\0", i1); 
    if (i2 < 0) 
     return link.Substring(i1); 
    else 
     return link.Substring(i1, i2 - i1); 
} 

pero será de descanso supuesto, si los cambios de formato LNK archivos.

2

en Windows 10 que necesita para hacer de este tipo, primero añada referencia COM a "Control de Shell Microsoft y automatización"

// new way for windows 10 
string targetname; 
string pathOnly = System.IO.Path.GetDirectoryName(LnkFileName); 
string filenameOnly = System.IO.Path.GetFileName(LnkFileName); 

Shell shell = new Shell(); 
Shell32.Folder folder = shell.NameSpace(pathOnly); 
FolderItem folderItem = folder.ParseName(filenameOnly); 
if (folderItem != null) { 
    Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
    targetname = link.Target.Path; // <-- main difference 
    if (targetname.StartsWith("{")) { // it is prefixed with {54A35DE2-guid-for-program-files-x86-QZ32BP4} 
    int endguid = targetname.IndexOf("}"); 
    if (endguid > 0) { 
     targetname = "C:\\program files (x86)" + targetname.Substring(endguid + 1); 
    } 
} 
Cuestiones relacionadas