Я хочу считать двоичное содержание .lnk файла. Пока цель ярлыка (lnk файл) существует, это хорошо работает с IO.File. ReadAllBytes (представляют файл в виде строки).
НО
Если цель ярлыка не существует (верьте мне, я хочу это), метод только возвращает нуль. Я предполагаю, что это вызвано тем, что ОС переходит по ссылке и если она не существует, она возвращает нуль
Там некоторый путь состоит в том, чтобы обойти то, что платформа следует за целью .lnk прежде, чем отобразить содержание .lnk файла?
Оказывается, файл был заблокирован, потому что он был скопирован с другой машины (я использую сервер 2008 r2), при разблокировке он вернул ожидаемое поведение.
Глупый я.
В этом нет большого смысла, нет простого способа проверить это. Я считаю, что лучший подход - прочитать файл .lnk так, как он должен читаться. Для этого можно использовать COM, класс ShellLinkObject реализует интерфейс IShellLink. Начните работу с Project + Добавить ссылку, перейдите на вкладку «Обзор» и перейдите к c: \ windows \ system32 \ shell32.dll. Это создает библиотеку взаимодействия. Напишите такой код:
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;
}
Я не верю, что ReadAllBytes заставляет ОС следовать lnk к своей цели. Я подозреваю, что ОС уже разрешила файл lnk (возможно, когда вы перешли к файлу в проводнике Windows).