2010-04-02 8 views
6

Je veux lire le contenu binaire d'un fichier .lnk. Tant que la cible du raccourci (fichier lnk) existe, cela fonctionne correctement avec IO.File.ReadAllBytes (fichier chaîne)..NET lire le contenu binaire du fichier .lnk

MAIS

Si la cible du raccourci n'existe pas (croyez-moi, je veux que ce) la méthode ne retourne que de zéro. Je suppose que c'est parce que le système d'exploitation suit le lien et s'il n'existe pas, il renvoie zéro

Existe-t-il un moyen de contourner le fait que le framework suit la cible du fichier .lnk avant d'afficher le contenu du fichier .lnk ?

Répondre

0

Transforme le fichier a été verrouillé car il a été copié à partir d'une autre machine (j'utilise le serveur 2008 R2) déverrouiller retourné le behavoir à attendre.

Stupide moi.

0

Je ne crois pas ReadAllBytes induit le système d'exploitation à suivre le lnk à sa cible. Je soupçonne, le système d'exploitation a déjà résolu le fichier lnk (peut-être lorsque vous avez navigué dans le fichier dans l'Explorateur Windows).

+0

Il s'agit d'un raccourci annoncé à partir d'un autre ordinateur, donc le lien ne peut jamais être résolu – Flores

18

Cela n'a pas beaucoup de sens, ne pas avoir un moyen facile de le vérifier. Je pense que la meilleure approche est de lire le fichier .lnk comme il est censé être lu. Vous pouvez utiliser COM pour le faire, le ShellLinkObject class implémente l'interface IShellLink. Premiers pas avec Project + Ajouter une référence, onglet Parcourir et accédez à c: \ windows \ system32 \ shell32.dll. Cela génère une bibliothèque interop. Ecrire du code comme ceci:

public static string GetLnkTarget(string lnkPath) { 
    var shl = new Shell32.Shell();   // Move this to class scope 
    lnkPath = System.IO.Path.GetFullPath(lnkPath); 
    var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath)); 
    var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath)); 
    var lnk = (Shell32.ShellLinkObject)itm.GetLink; 
    return lnk.Target.Path; 
} 
+0

Nice snippet. BTW, quand j'ai utilisé cela, j'ai dû changer la dernière ligne pour retourner lnk.Target.Path. –

+0

En fait, la dernière ligne devrait être retourner lnk.Path –

+0

Cela fonctionne même avec des signes diacritiques! – qub1n

Questions connexes