.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).

Другие вопросы по тегам