Как вы получаете цель каталога в ярлыке? Я ищу повсюду и обнаруживаю только цель ярлыка.
Получить целевую папку быстрого доступа
Ответ 1
Я думаю, вам нужно будет использовать 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
Если вы не хотите использовать зависимости, вы можете использовать https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/ Но формат lnk недокументирован, поэтому делайте это только в том случае, если понимаете риски.
Ответ 3
Еще более простой способ получить связанный путь, который я использую:
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 изменится.
Ответ 4
В 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);
}
}
Ответ 5
если вы хотите найти свой путь к приложениям, который имеет ярлык на рабочем столе, простым способом, который я использую, является следующее:
Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\")
этот код возвращает любой исполняемый путь exe, независимо от того, кто запросил файл
Ответ 6
Все ярлыки файлов имеют расширение .lnk, которое вы можете проверить. Например, используя строку, вы можете использовать string.EndsWith( ". Lnk" ) в качестве фильтра.
Все ярлыки URL-адресов имеют расширение .url, поэтому вам также нужно будет учитывать их, если это необходимо.