如何以编程方式跟踪.lnk文件

时间:2011-12-28 20:07:12

标签: c# .net windows winforms winapi

我们有一个充满快捷方式(.lnk文件)的网络驱动器,指向文件夹,我需要在C#Winforms应用程序中以编程方式遍历它们。

我有哪些实用选项?

5 个答案:

答案 0 :(得分:13)

添加IWshRuntimeLibrary作为项目的参考。添加引用,COM选项卡,Windows脚本主机对象模型。

以下是我获取快捷方式属性的方法:

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

快捷方式对象“sc”具有TargetPath属性。

答案 1 :(得分:1)

如果您不想引用COM,并将Interop.IWshRuntimeLibrary.dll与您的产品一起分发(记住Jay Riggs" Embed Interop Types":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;
        }
    }
}

答案 2 :(得分:0)

  1. 使用COM IPersistFile界面加载文件。
  2. 对结果执行QueryInterface以将其转换为IShellLink接口。
  3. 调用IShellLink :: GetPath
  4. 据我所知,你可以使用&#34; Add Reference&#34;来生成符合每个接口的.NET生成类。对话框。

答案 3 :(得分:0)

IShellLink界面允许您操作.lnk文件,尽管从C#中使用它会有点痛苦。

This article有一些代码实现了必要的互操作gubbins。

<强>更新

您可以找到文章here中的代码,但该网页似乎无法在Firefox中使用。它确实在IE中工作。

答案 4 :(得分:0)

我知道这不是正确的方法,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);
    }