2012-02-23 12 views
14

Jak uzyskać docelowy katalog folderu skrótów? Wszędzie szukam i znajduję tylko docelowy plik skrótu.Pobierz cel folderu skrótów

+1

ten nie odnosi się do WPF w ogóle, usunąłem tag –

+0

To rozwiązanie Wolę: [Jak uzyskać nazwę ścieżki ze skrótu do pliku?] (http://stackoverflow.com/a/13079688/3757210) – ilcorvo

Odpowiedz

22

myślę, że będzie trzeba użyć COM i dodać odwołanie do „Microsoft Kontroli Shell i automatyzacja”, jak opisano w this blog post:

Oto przykład przy użyciu kodu pod warunkiem, że:

namespace Shortcut 
{ 
    using System; 
    using System.Diagnostics; 
    using System.IO; 
    using Shell32; 

    class Program 
    { 
     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; 
     } 

     static void Main(string[] args) 
     { 
      const string path = @"C:\link to foobar.lnk"; 
      Console.WriteLine(GetShortcutTargetFile(path)); 
     } 
    } 
} 
+0

Dzięki! Teraz po prostu muszę dowiedzieć się, jak programowo szukać folderu shortcuf :) –

+2

Pracuję na 64-bitowym systemie Windows 7 i nie mogę znaleźć skrótu do VirtualBox zainstalowanego w 'C: \ Program Files \ Oracle \ VirtualBoxOSX'. Wciąż zwracał cel, aby znaleźć się w 'C: \ Program Files (x86) \ Oracle \ VirtualBoxOSX \ VirtualBox.exe'. Jakieś wyjaśnienie tego zachowania? – swdev

+0

Używanie Shell32 w tej metodzie dozwolone jest tylko w aplikacji z jednym wątkiem. Musisz uwzględnić [STAThread] w głównym punkcie wejścia. Otrzymasz wyjątek w testowaniu jednostkowym z tym kodem, ponieważ testowanie jednostkowe nie pozwala STAThread. patrz [odpowiedź] (http://stackoverflow.com/questions/14543340/calling-shell32-dll-from-net-windows-service). Istnieje również rozwiązanie do uruchomienia tego kodu w testowaniu jednostkowym, patrz http://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn

-2

Wszystkie skróty plików mają rozszerzenie .lnk, które można sprawdzić. Używając na przykład łańcucha, możesz użyć string.EndsWith (".lnk") jako filtra.

Wszystkie skróty adresu URL mają rozszerzenie pliku .url, więc w razie potrzeby należy je uwzględnić również w przypadku tych skrótów.

+1

OP zapytał, jak uzyskać docelowy katalog skrótu, a nie jak sprawdź, czy jest skrótem. –

0

jeśli chcesz znaleźć swoją ścieżkę aplikacji, która ma skrót na pulpicie, w łatwy sposób, że używam, jest następujący:

Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\") 

ten kod powrotu dowolną ścieżkę exe, który działa niezależnie, że kto żądany plik

1

jeszcze prostszy sposób, aby uzyskać połączoną ścieżkę że używam to:

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

Ale to będzie przerwy oczywiście jeśli zmiany formatu LNK-plików.

2

W oknach 10 to musi być zrobione tak, najpierw dodać odwołanie COM do „Microsoft sterowania Shell i automatyzacja”

// new way for windows 10 
string targetname; 
string pathOnly = System.IO.Path.GetDirectoryName(LnkFileName); 
string filenameOnly = System.IO.Path.GetFileName(LnkFileName); 

Shell shell = new Shell(); 
Shell32.Folder folder = shell.NameSpace(pathOnly); 
FolderItem folderItem = folder.ParseName(filenameOnly); 
if (folderItem != null) { 
    Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
    targetname = link.Target.Path; // <-- main difference 
    if (targetname.StartsWith("{")) { // it is prefixed with {54A35DE2-guid-for-program-files-x86-QZ32BP4} 
    int endguid = targetname.IndexOf("}"); 
    if (endguid > 0) { 
     targetname = "C:\\program files (x86)" + targetname.Substring(endguid + 1); 
    } 
}