.NET читать двоичное содержимое файла .lnk

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

НО

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

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

Ответы на вопрос(3)

Решение Вопроса

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

Глупый я.

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

 Flores02 апр. 2010 г., 11:29
Это рекламируемый ярлык с другого компьютера, поэтому ссылка не может быть разрешена

нет простого способа проверить это. Я считаю, что лучший подход - это читать файл .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;
}
 Mark T20 июн. 2011 г., 23:35
На самом деле, последняя строка должна быть возвращена lnk.Path
 Tomas Kubes24 окт. 2013 г., 10:09
Это работает даже с диакритическими знаками!
 Hans Passant19 апр. 2018 г., 16:23
Это рискованно, старые версии Windows не ведут себя хорошо, когда вы используете этот объект в не-STA-потоке. Win7 - это новая XP.
 Mr. Bungle17 апр. 2011 г., 04:14
Хороший фрагмент. Кстати, когда я использовал это, мне пришлось изменить последнюю строку, чтобы вернуть lnk.Target.Path.
 JSWulf19 апр. 2018 г., 16:19
Я могу использовать это, чтобы прочитать файл .lnk без использования пользовательского интерфейса или другого потока.
 robertburke01 февр. 2017 г., 01:33
Похоже, для этого требуется запуск потока STA, который вы получаете бесплатно в приложении с пользовательским интерфейсом C #, но его необходимо создать вручную в приложении консоли. Даже тогда я столкнулся с ошибками на некоторых машинах, которые, по-видимому, связаны с разрешениями на взаимодействие с системой пользовательского интерфейса. Консольные приложения (включая службы Windows) могут не иметь разрешения на взаимодействие с пользовательским интерфейсом. IShellLink более низкого уровня, кажется, избегает этих проблем потока и разрешений STA. Смотрите принятый ответ здесь:stackoverflow.com/questions/139010/...
 dmihailescu19 февр. 2014 г., 23:26
Вы также должны добавить сборку Microsoft.Csharp, чтобы избежать ошибки компиляции Binder, и вместо того, чтобы добавить shell32.dll, вы должны выбрать «Microsoft Shell Controls And Automation» на вкладке «Библиотеки типов COM».

Ваш ответ на вопрос