c#如何创建快捷方式并获取现有快捷方式的路径(最佳实践)

时间:2016-07-01 04:27:28

标签: c# shortcuts

项目会搜索多个快捷方式以查找其路径。它还创建了快捷方式。

在阅读了很多帖子后,似乎有多种方法可以解决这个问题,有些使用参考:COM - > Windows脚本宿主对象模型,有些没有。使用需要添加此引用的选项是否是性能负担?

我找到了一篇文章,展示了如何使用旧的VB代码创建一个快捷方式并在下面发布以防万一它可以帮助任何人,并询问这种方式是否比使用参考:Windows脚本宿主对象模型更少的性能压力< / p>

string[] myLines = {"set WshShell = WScript.CreateObject(\"WScript.Shell\")",
    "strDesktop = \"" + destinationDir + "\"",
    "set oShellLink = WshShell.CreateShortcut(\"" + path2shortcut + "\")"
    "oShellLink.TargetPath = \"" + targetPath + "\"",
    "oShellLink.WindowStyle = 1",
    "oShellLink.HotKey = \"CTRL+SHIFT+F\"",
    "oShellLink.IconLocation = \"notepad.exe, 0\"",
    "oShellLink.WorkingDirectory = strDesktop",
    "oShellLink.Save()" };
System.IO.File.WriteAllLines("test.vbs", myLines);
System.Diagnostics.Process P = System.Diagnostics.Process.Start("test.vbs");
P.WaitForExit(int.MaxValue);
System.IO.File.Delete("test.vbs");

因为上面不需要添加引用,Windows脚本宿主对象模型, 我想知道它是否更好的性能使用一种方法来获得一个快捷方式的路径,这也不需要参考Windows脚本宿主对象模型。

以下是搜索快捷方式的两种方法选择。

选项1)使用参考COM - &gt; Windows脚本宿主对象模型..

WshShell shell = new WshShell();
link = (IWshShortcut)shell.CreateShortcut(linkPathName);
MessageBox.Show(link.TargetPath);

选项2)不使用Reference,它使用FileStream,名为Blez的用户显示如何在不添加引用的情况下执行 [这是链接 - https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/]

FileStream fileStream = File.Open(file, FileMode.Open, FileAccess.Read)
using (System.IO.BinaryReader fileReader = new BinaryReader(fileStream))
{
    fileStream.Seek(0x14, SeekOrigin.Begin);     // Seek to flags
    uint flags = fileReader.ReadUInt32();        // Read flags
    // ... code continues for another 15 lines
}

如果一次迭代许多快捷方式(大约100个),这些选项中的任何一个对性能是否更好? 我不确定这对性能造成的负担,所以我想也许明智的做法是使用&#39;使用&#39;声明? (也许这是不可能的或者过度杀戮&#39;)我尝试了很多方法而没有办法做到这一点。  我甚至尝试直接引用DLL:     &#39; [System.Runtime.InteropServices.DllImport(&#34; SHELL32.DLL&#34)]&#39;      但仍然没有运气。

因此,我请求您的帮助,以便找到创建快捷方式的最佳效果。搜索快捷方式的路径。

欢迎任何输入。我试图尽可能简单明了。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下是您问题的部分答案:

您是我所知道的创建快捷方式文件的唯一方法。 这是我遇到的快捷方式文件读取目标路径的最快方式。这也使用Shell32引用。

public static string GetShortcutTargetFile(string shortcutFilename)
    {
        string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
        string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);

        Shell shell = new Shell();
        Folder folder = shell.NameSpace(pathOnly);
        FolderItem folderItem = folder.ParseName(filenameOnly);
        if (folderItem != null)
        {
            Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
            return link.Path;
        }

        return string.Empty;
    }

我已经测试了这个以读取100个快捷方式文件的目标路径。对于我的机器,它会在0.9秒内读取这些路径。