2012-02-23 2 views
14

Как вы получаете цель каталога в папке быстрого доступа? Я ищу повсюду и только находит целевой файл ярлыков.Получить целевую папку с ярлыками

+1

это не относится к МОФ вообще, я удалил тег –

+0

Это Я предпочитаю: [Как получить имя пути из ярлыка файла?] (http://stackoverflow.com/a/13079688/3757210) – ilcorvo

ответ

22

Я думаю, вам нужно будет использовать COM и добавить ссылку на «Microsoft Control Shell и автоматизации», как описано в this blog post:

Вот пример использования кода при условии:

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

Спасибо! Теперь мне просто нужно выяснить, как искать папку shortcuf programmatical :) :) –

+2

Я работаю на 64-разрядной версии Windows 7, и не удается найти ярлык для VirtualBox, установленный в 'C: \ Program Files \ Oracle \ VirtualBoxOSX'. Он продолжал возвращать цель в папку 'C: \ Program Files (x86) \ Oracle \ VirtualBoxOSX \ VirtualBox.exe'. Любое объяснение этого поведения? – swdev

+0

Использование Shell32 с помощью этого метода допускает только однопоточное приложение. Вы должны включить [STAThread] в основную точку входа. Вы получите исключение в модульном тестировании с помощью этого кода, потому что модульное тестирование не позволяет STAThread. см. [ответ] (http://stackoverflow.com/questions/14543340/calling-shell32-dll-from-net-windows-service). Существует также решение для запуска этого кода в модульном тестировании, см. Http://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn

-2

Все ярлыки файлов имеют расширение .lnk, которое вы можете проверить. Например, используя строку, вы можете использовать string.EndsWith (". Lnk") в качестве фильтра.

Все ярлыки URL-адресов имеют расширение .url, поэтому вам также необходимо будет учитывать их, если это необходимо.

+1

. ОП спросил, как получить целевой каталог ярлыка, а не как проверьте, является ли это ярлыком. –

0

, если вы хотите найти свой путь к приложению, которое ярлык на рабочем столе, простой способ, который я использую, заключается в следующем:

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

этого код возврата любого еха путь, который работает, независимо тем, кто просил файл

1

еще более простой способ получить связанный путь, который я использую:

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

Но это, конечно, перерыв, если изменения формата LNK-файлов.

2

В окнах 10 это должно быть сделано, как это, первым добавить COM ссылки на «Microsoft Control Shell и автоматизация»

// 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); 
    } 
} 
Смежные вопросы