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

本文关键字:跟踪 link 文件 方式 编程 | 更新日期: 2023-09-27 18:19:02

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

我有哪些实用的选项?

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

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

下面是获取快捷键属性的方法:
IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);

快捷方式对象"sc"有一个TargetPath属性

如果您不希望引用COM,并与您的产品一起分发Interop. iwtimelibrlibrary .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;
        }
    }
}

我知道这不是正确的方式,链接文件结构可以改变等,但这就是我所做的:

    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);
    }
  1. 使用COM IPersistFile接口加载文件
  2. 对结果执行QueryInterface,将其转换为IShellLink接口。
  3. 调用IShellLink: GetPath

据我所知,你可以让。net生成符合这些接口的类,使用"添加引用"对话框。

IShellLink接口允许您操作. link文件,尽管在c#中使用它有点麻烦。

本文有一些实现必要的互操作库的代码。

您可以在这里找到文章中的代码,但该页面似乎无法在Firefox中工作。