Как следить за файлом .lnk программно - PullRequest
11 голосов
/ 29 декабря 2011

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

Какие практические опции делают яесть

Ответы [ 5 ]

13 голосов
/ 29 декабря 2011

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

Вот как я могу получить свойства ярлыка:

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

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

1 голос
/ 09 марта 2018

Если вы не хотите ссылаться на COM и распространять Interop.IWshRuntimeLibrary.dll вместе с вашим продуктом (помните, что Джей Риггс «Встраивать типы взаимодействия»: False)

Вместо этого вы можете использовать новый динамический COM.

private void Window_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        dynamic shortcut;
        dynamic windowsShell;
        try
        {
            var file = files[0];
            if (Path.GetExtension(file)?.Equals(".lnk",StringComparison.OrdinalIgnoreCase) == true)
            {
                Type shellObjectType = Type.GetTypeFromProgID("WScript.Shell");
                windowsShell = Activator.CreateInstance(shellObjectType);
                shortcut = windowsShell.CreateShortcut(file);
                file = shortcut.TargetPath;
                // Release the COM objects
                shortcut = null;
                windowsShell = null;
            }
            //
            // <use file>...
            //
        }
        finally
        {
            // Release the COM objects
            shortcut = null;
            windowsShell = null;
        }
    }
}
0 голосов
/ 07 декабря 2016

Я знаю, что это не правильный путь, и что файловые структуры 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);
    }
0 голосов
/ 29 декабря 2011

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

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

Обновление

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

0 голосов
/ 29 декабря 2011
  1. Загрузка файла с использованием интерфейса COM IPersistFile.
  2. Выполнение QueryInterface для результата, чтобы превратить его в интерфейс IShellLink.
  3. Вызов IShellLink :: GetPath

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

...