2008-11-22 5 views
6

Je dois tester si un fichier est un raccourci. J'essaie toujours de comprendre comment les choses seront configurées, mais je pourrais seulement avoir son chemin, je pourrais avoir seulement le contenu réel du dossier (comme byte []) ou je pourrais avoir les deux.Comment puis-je tester par programme si un chemin/fichier est un raccourci?

Quelques complications comprennent que je il pourrait être dans un fichier zip (dans ce cas, le chemin sera un chemin interne)

Répondre

14

Les raccourcis peuvent être manipulés à l'aide des objets COM dans SHELL32.DLL.

Dans votre projet Visual Studio, ajoutez une référence à la bibliothèque COM « Contrôles Microsoft Shell et automatisation », puis utilisez les éléments suivants:

/// <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 
} 

Vous pouvez obtenir la cible réelle du lien comme suit:

/// <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

ce serait presque travailler, sauf pour les cas où le raccourci est dans un fichier zip (je suppose, je ne l'ai pas testé) ou si tout ce que j'ai est comme un tampon d'octets. – BCS

+0

Vous pourriez écrire du code pour gérer ces cas, non? –

+0

Cela m'a aidé à éviter d'avoir à utiliser une référence InterOp.Shell32 parasite. Espérons que la connaissance aide les autres aussi. – ouflak

3

Vous pouvez simplement vérifier l'extension et/ou le contenu de ce fichier. Il contient un GUID spécial dans l'en-tête.

Lecture this document.

+3

que le lien est cassé – Letseatlunch

-1

Vérifiez l'extension? (.lnk)

Questions connexes