2008-11-22 8 views
6

Ich muss testen, ob eine Datei eine Verknüpfung ist. Ich versuche immer noch herauszufinden, wie das Zeug aufgebaut wird, aber ich habe vielleicht nur seinen Pfad, ich habe vielleicht nur den eigentlichen Inhalt der Datei (als ein Byte []) oder ich könnte beides haben.Wie kann ich programmgesteuert testen, ob ein Pfad/eine Datei eine Verknüpfung ist?

Ein paar Komplikationen sind, dass ich es in einer Zip-Datei sein könnte (in diesem Fall der Weg einen internen Pfad)

Antwort

14

Verknüpfungen können mithilfe der COM-Objekte in SHELL32.DLL bearbeitet werden.

In Ihrem Visual Studio-Projekt, einen Verweis auf die COM-Bibliothek „Microsoft Shell-Bedienelemente und Automation“ hinzufügen und dann verwenden Sie die folgende:

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

Sie können die tatsächliche Ziel des Links erhalten Sie wie folgt vor:

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

gebrochen das außer fast funktionieren würde für die Fälle, in denen die Verknüpfung in einer Zip-Datei ist (ich würde davon ausgehen, ich habe nicht getestet), oder wenn alles, was ich habe, ist es als ein Byte-Puffer. – BCS

+0

Sie könnten etwas Code schreiben, um diese Fälle zu behandeln, richtig? –

+0

Dies half mir zu vermeiden, eine streunende InterOp.Shell32 Referenz zu verwenden. Ich hoffe, dass Wissen auch anderen hilft. – ouflak

3

Sie können einfach die Erweiterung überprüfen und/oder Inhalt dieser Datei. Es enthält eine spezielle GUID in der Kopfzeile.

Gelesen this document.

+3

, die Verbindung ist – Letseatlunch

-1

Überprüfen Sie die Erweiterung? (.lnk)