.NET читать двоичное содержимое файла .lnk - PullRequest
7 голосов
/ 02 апреля 2010

Я хочу прочитать двоичное содержимое файла .lnk. Пока существует цель ярлыка (файл lnk), это прекрасно работает с IO.File.ReadAllBytes (строковый файл).

НО

Если цель ярлыка не существует (поверьте мне, я хочу этого), метод возвращает только нули. Я думаю, это потому, что ОС следует по ссылке и, если она не существует, она возвращает нули

Есть ли способ обойти тот факт, что фреймворк следует цели .lnk перед отображением содержимого файла .lnk?

Ответы [ 3 ]

20 голосов
/ 02 апреля 2010

Это не имеет большого смысла, нет простого способа проверить это. Я считаю, что лучший подход - это читать файл .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;
}
0 голосов
/ 11 апреля 2010

Оказывается, файл был заблокирован, потому что он был скопирован с другого компьютера (я использую сервер 2008 r2), разблокировка вернула ожидаемое поведение.

Глупый я.

0 голосов
/ 02 апреля 2010

Я не верю, что ReadAllBytes побуждает ОС следовать за своей целью. Я подозреваю, что ОС уже разрешила файл lnk (возможно, при просмотре файла в проводнике Windows).

...