.NET lit le contenu binary du fichier .lnk

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

MAIS

Si la cible du raccourci n’existe pas (croyez-moi, je veux ceci), la méthode ne renvoie que les zéros. J’imagine 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 cadre suit la cible du fichier .lnk avant d’afficher le contenu du fichier .lnk?

Cela n’a pas beaucoup de sens, il n’y a pas de moyen facile de le vérifier. Je pense que la meilleure approche consiste à lire le fichier .lnk de la façon dont il est censé être lu. Vous pouvez utiliser COM pour ce faire, la classe ShellLinkObject implémente l’interface IShellLink. Familiarisez-vous avec Project + Ajouter une référence, onglet Parcourir et accédez à c: \ windows \ system32 \ shell32.dll Cela génère une bibliothèque d’interopérabilité. Écrivez le code comme ceci:

public static ssortingng GetLnkTarget(ssortingng 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; } 

Je ne crois pas que ReadAllBytes incite le système d’exploitation à suivre l’lnk jusqu’à sa cible. Je suppose que le système d’exploitation a déjà résolu le fichier LNK (peut-être lorsque vous avez accédé au fichier dans l’explorateur Windows).

Il s’avère que le fichier a été verrouillé, car il a été copié à partir d’une autre machine (j’utilise le serveur 2008 R2). Le délocking a renvoyé le comportement attendu.

Stupide que je suis.