2016-07-01 11 views
1

Ein Projekt durchsucht mehrere Verknüpfungen, um deren Pfad zu finden. Es erstellt auch Verknüpfungen.C# So erstellen Sie eine Verknüpfung und rufen den Pfad einer vorhandenen Verknüpfung ab (Best Practice)

Nach dem Lesen vieler Posts scheint es dort mehrere Möglichkeiten, dies zu nähern, einige mit Referenz zu: COM -> Windows Script Host Object Model, und einige ohne. Ist es eine Leistungslast, die Optionen zu verwenden, die das Hinzufügen dieser Referenz erfordern?

Ich habe einen Beitrag gefunden, der gezeigt hat, wie man alten VB-Code verwendet, um einen Shortcut zu erstellen und unten, falls es jemandem hilft und zu fragen, ob dieser Weg irgendwie weniger Leistungsstress ist als ein Reference to: Windows Script Host Objektmodell

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

Da oben erfordert nicht auf Verweis hinzufügen, Windows Script Host Object Model, ich frage mich, ob es besser für die Leistung einer Art und Weise zu verwenden, eine Verknüpfung in den Weg zu bekommen, die auch benötigt keinen Verweis auf Windows Skript-Host-Objektmodell.

Hier sind 2 Möglichkeiten der Suche nach Abkürzungen.

Option 1) Verweis auf COM verwendet -> Windows Script Host Object Model ..

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

Option 2) bezieht sich nicht verwenden, verwendet es Filestream, ein Benutzer namens Blez zeigt, wie ohne ein zu tun Hinzufügen Referenz [Hier ist die Link- 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 
} 

ist eine dieser Optionen besser für Leistung, wenn viele Abkürzungen (ca. 100) zu einem Zeitpunkt, zu iterieren? Ich bin mir nicht sicher, welche Belastung das für die Leistung bedeutet, also dachte ich mir, dass es vielleicht sinnvoll wäre, eine "using" -Anweisung zu verwenden? (vielleicht ist es nicht möglich oder 'Overkill') Ich habe viele Möglichkeiten ausprobiert und keinen Weg gefunden, dies zu tun. Ich habe sogar versucht, die DLL direkt mit: '[System.Runtime.InteropServices.DllImport ("shell32.dll")]' und immer noch kein Glück.

So frage ich Ihre Hilfe, um die beste Leistung zum Erstellen von Verknüpfungen & Suche nach Pfad der Verknüpfungen zu finden.

Jede Eingabe ist willkommen. Ich habe versucht, ein einfaches und spezifisches wie möglich zu machen. Ich schätze deine Hilfe SO!

Antwort

1

Es folgt teilweise Antwort auf Ihre Frage:

Yours sind die einzigen Möglichkeiten, um Shortcut-Dateien zu erstellen, die ich kenne. Dies ist der schnellste Weg, den ich für Lesen Zielpfad der Verknüpfungsdatei angetroffen habe. Dies verwendet auch Shell32-Referenz.

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; 
    } 

Ich habe dies zum Lesen Zielpfad von 100 Shortcut-Dateien getestet. Für meine Maschine liest es diese Pfade in 0,9 Sekunden.

+0

Großartig! Vielen Dank für die Informationen. Sind Ihnen irgendwelche Leistungsprobleme bei der Verwendung von Reference to Shell32 bekannt? (was meiner Meinung nach nur verfügbar ist, wenn Sie auf das Windows Script Host-Objektmodell verweisen) – Budapest