.NET читать двоичное содержимое файла.lnk
Я хочу прочитать двоичное содержимое файла.lnk. Пока существует цель ярлыка (файл lnk), это прекрасно работает с IO.File.ReadAllBytes(строковый файл).
НО
Если цель ярлыка не существует (поверьте мне, я хочу это), метод возвращает только нули. Я думаю, это потому, что ОС следует по ссылке, и если она не существует, она возвращает нули
Есть ли способ обойти тот факт, что фреймворк следует цели.lnk перед отображением содержимого файла.lnk?
3 ответа
Оказывается, файл был заблокирован, потому что он был скопирован с другого компьютера (я использую сервер 2008 r2), разблокировка вернула ожидаемое поведение.
Глупый я.
Это не имеет большого смысла, нет простого способа проверить это. Я считаю, что лучший подход - это читать файл.lnk так, как он должен быть прочитан. Для этого вы можете использовать COM, класс ShellLinkObject реализует интерфейс IShellLink. Начните с Project + Add Reference, перейдите на вкладку Browse и перейдите к 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 (возможно, когда вы просматривали файл в Windows Explorer).