Как программно выполнять файл .lnk

У нас есть сетевой диск, полный ярлыков (.lnk файлов), которые указывают на папки, и мне нужно программно их перемещать в приложении С# Winforms.

Какие практические варианты у меня есть?

Ответ 1

Добавьте IWshRuntimeLibrary в качестве ссылки на ваш проект. Добавить ссылку, вкладку COM, модель объекта хоста Windows Scripting.

Вот как я получаю свойства ярлыка:

IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);

Объект ярлыка "sc" имеет свойство TargetPath.

Ответ 2

  • Загрузите файл с помощью интерфейса COM IPersistFile.
  • Сделайте QueryInterface для результата, чтобы превратить его в интерфейс IShellLink.
  • Вызов IShellLink:: GetPath

Насколько мне известно, вы можете создавать классы .NET, соответствующие каждому из этих интерфейсов, для использования диалогового окна "Добавить ссылку".

Ответ 3

Интерфейс IShellLink позволяет вам манипулировать файлами .lnk, хотя это немного больно для использования с С#.

В этой статье есть некоторый код, реализующий необходимые взаимодействия gubbins.

Обновление

Вы можете найти код из статьи здесь, но эта страница, похоже, не работает в Firefox. Он работает в IE.

Ответ 4

Я знаю, что это не правильный путь и что структуры файлов lnk могут меняться и т.д., но это то, что я делаю:

    private static string LnkToFile(string fileLink)
    {
        string link = File.ReadAllText(fileLink);
        int i1 = link.IndexOf("DATA\0");
        if (i1 < 0)
            return null;
        i1 += 5;
        int i2 = link.IndexOf("\0", i1);
        if (i2 < 0)
            return link.Substring(i1);
        else
            return link.Substring(i1, i2 - i1);
    }