Вопрос по c#, .net, shortcut – .NET читать двоичное содержимое файла .lnk

7

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

НО

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

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

Ваш Ответ

3   ответа
20

нет простого способа проверить это. Я считаю, что лучший подход - это читать файл .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;
}
Хороший фрагмент. Кстати, когда я использовал это, мне пришлось изменить последнюю строку, чтобы вернуть lnk.Target.Path. Mr. Bungle
Это рискованно, старые версии Windows не ведут себя хорошо, когда вы используете этот объект в не-STA-потоке. Win7 - это новая XP. Hans Passant
Это работает даже с диакритическими знаками! Tomas Kubes
Я могу использовать это, чтобы прочитать файл .lnk без использования пользовательского интерфейса или другого потока. JSWulf
0

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

Глупый я.

0

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

Это рекламируемый ярлык с другого компьютера, поэтому ссылка не может быть разрешена Flores

Похожие вопросы