Получить цель папки быстрого доступа - PullRequest
15 голосов
/ 23 февраля 2012

Как вы получаете целевой каталог для ярлыка папки? Я ищу везде и нахожу только цель файла ярлыка.

Ответы [ 7 ]

23 голосов
/ 23 февраля 2012

Я думаю, вам нужно будет использовать COM и добавить ссылку на «Microsoft Shell Control And Automation», как описано в этом сообщении в блоге :

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

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));
        }
    }
}
2 голосов
/ 05 мая 2017

В Windows 10 это нужно сделать следующим образом, сначала добавьте ссылку на COM в «Microsoft Shell Control And Automation»

// 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);
  }
}
1 голос
/ 07 декабря 2016

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

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-файла.

1 голос
/ 30 января 2016

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

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

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

1 голос
/ 20 апреля 2015

Если вы не хотите использовать зависимости, вы можете использовать https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/ Но формат lnk недокументирован, так что делайте это, только если вы понимаете риски.

0 голосов
/ 11 апреля 2018

Благодаря Mohsen.Sharify ответ Я получил более аккуратный код:

var fileName = Process.GetCurrentProcess().MainModule.FileName;
var folderName = Path.Combine(fileName, ".."); //origin folder
0 голосов
/ 04 июля 2012

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

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

...