2008-11-22 10 views
6

Necesito comprobar si un archivo es un atajo. Todavía estoy tratando de descubrir cómo se configurarán las cosas, pero tal vez solo tenga su ruta, es posible que solo tenga el contenido real del archivo (como un byte []) o podría tener ambas.¿Cómo puedo probar programáticamente si una ruta/archivo es un acceso directo?

Algunas complicaciones incluyen que podría ser en un archivo zip (en estos casos, la ruta será un camino interno)

Respuesta

14

Los accesos directos se pueden manipular utilizando los objetos COM en SHELL32.DLL.

En el proyecto de Visual Studio, agregue una referencia a la biblioteca COM "Controles de Microsoft Shell y Automatización" y luego utilizar el siguiente:

/// <summary> 
/// Returns whether the given path/file is a link 
/// </summary> 
/// <param name="shortcutFilename"></param> 
/// <returns></returns> 
public static bool IsLink(string shortcutFilename) 
{ 
    string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename); 
    string filenameOnly = System.IO.Path.GetFileName(shortcutFilename); 

    Shell32.Shell shell = new Shell32.ShellClass(); 
    Shell32.Folder folder = shell.NameSpace(pathOnly); 
    Shell32.FolderItem folderItem = folder.ParseName(filenameOnly); 
    if (folderItem != null) 
    { 
     return folderItem.IsLink; 
    } 
    return false; // not found 
} 

usted puede conseguir el objetivo real del enlace de la siguiente manera:

/// <summary> 
    /// If path/file is a link returns the full pathname of the target, 
    /// Else return the original pathnameo "" if the file/path can't be found 
    /// </summary> 
    /// <param name="shortcutFilename"></param> 
    /// <returns></returns> 
    public static string GetShortcutTarget(string shortcutFilename) 
    { 
     string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename); 
     string filenameOnly = System.IO.Path.GetFileName(shortcutFilename); 

     Shell32.Shell shell = new Shell32.ShellClass(); 
     Shell32.Folder folder = shell.NameSpace(pathOnly); 
     Shell32.FolderItem folderItem = folder.ParseName(filenameOnly); 
     if (folderItem != null) 
     { 
      if (folderItem.IsLink) 
      { 
       Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
       return link.Path; 
      } 
      return shortcutFilename; 
     } 
     return ""; // not found 
    } 
+0

que casi con trabajar a excepción de los casos en los que el acceso directo se encuentra en un archivo zip (yo supongo, no he probado esto), o cuando todo lo que tengo es como una memoria intermedia de bytes. – BCS

+0

Podría escribir algún código para manejar esos casos, ¿verdad? –

+0

Esto me ayudó a evitar tener que utilizar una referencia de InterOp.Shell32. Espero que el conocimiento ayude a otros también. – ouflak

3

lo puede ver simplemente la extensión y/o el contenido de este archivo. Contiene un GUID especial en el encabezado.

Lea this document.

+3

que vínculo se rompe – Letseatlunch

-1

Compruebe la extensión? (.lnk)

Cuestiones relacionadas