2016-07-01 5 views
1

Проект ищет несколько ярлыков, чтобы найти их путь. Он также создает ярлыки.C# Как создать ярлык и получить путь к существующему ярлыку (лучшая практика)

После прочтения многих сообщений, кажется, существует несколько способов приблизиться к этому, некоторые из них используют ссылку на: COM -> Модель объекта сценария Windows Script, а некоторые - нет. Не стоит ли использовать параметры, требующие добавления этой ссылки?

Я разместил сообщение, в котором показано, как использовать старый код VB, чтобы создать ярлык и выложить ниже, в случае, если он помогает кому-либо и спрашивает, так ли это как-то меньше стресса по сравнению с использованием ссылки на:

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"); 

Поскольку выше не требует Add Reference, Windows Script Host Object Model, мне интересно, если его лучше для производительности использовать способ, чтобы получить путь ярлыка, в который также не требует Ссылка на Windows, Модель объекта хоста сценария.

Ниже приведены 2 способа поиска путей поиска.

вариант 1) использует Ссылка на COM -> Установка Windows Script Host Object Model ..

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

вариант 2) Не используйте Reference, он использует FileStream, пользователь по имени Блезу показывает, как сделать без добавления Ссылка [Вот ссылка- 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), в то время? Я не уверен в том, что это налагает нагрузку, поэтому я подумал, что было бы разумно использовать «использование» заявления? (возможно, это невозможно или «перехитрить»). Я пробовал много способов и не нашел способ сделать это. Я даже попытался обратиться к DLL напрямую с помощью: '[System.Runtime.InteropServices.DllImport ("shell32.dll")]' и до сих пор не повезло.

Так что я прошу вашу помощь, чтобы найти наилучшую производительность для создания ярлыков & Поиск путей быстрого доступа.

Любой вход приветствуется. Я попытался сделать простой и конкретный, насколько это возможно. Я ценю вашу помощь!

ответ

1

Ниже приводится частичный ответ на ваш вопрос:

Yours единственные способы создания контекстные файлы, которые я знаю. Это самый быстрый способ, с которым я столкнулся для чтения целевого пути файла ярлыков. Это также использует ссылку 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 секунды.

+0

Отлично! Спасибо за информацию, знаете ли вы о каких-либо проблемах с производительностью при использовании ссылки на Shell32? (который, по моему мнению, доступен только с помощью ссылки «Добавить ссылку на объектную модель хоста Windows Script») – Budapest

 Смежные вопросы

  • Нет связанных вопросов^_^