Неудача в поиске цели ярлыка

Я пытаюсь создать небольшую программу, которая возвращает пользователю целевое имя файла ярлыка в С# (консольное приложение). Мой код работает без ошибок, но это не дает мне правильный результат.

Это мой код: (взято с: http://snipplr.com/view/47974)

private static string GetTargetPath(string ShortcutPath)
{ string pathOnly = System.IO.Path.GetDirectoryName(ShortcutPath); string filenameOnly = System.IO.Path.GetFileName(ShortcutPath); Shell32.Shell shell = new Shell32.ShellClass(); Shell32.Folder folder = shell.NameSpace(pathOnly); Shell32.FolderItem folderItem = folder.ParseName(filenameOnly); if (folderItem != null) { Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; return link.Path; } return ""; // not found
}

Как я уже сказал, код возвращает неверный вывод (пустая строка), даже если файл существует. например, я устал, чтобы получить целевой файл некоторого ярлыка в пути: C:\Users\Admin123\AppData\Roaming\Microsoft\Office\Recent

Что может быть причиной этой проблемы? и как я могу его решить?

РЕДАКТИРОВАТЬ

Я снова попробовал тот же код, и теперь он работает! Спасибо всем ! :)

1 ответ

Ну, я не вижу проблем с вашим кодом. Протестировано и работает хорошо.

Я создал две ссылки: boot.lnk и prestigio_notes.lnk, которые приводят к правильным файлам. Их выход был:

D:\Boot1.asm и D:\Dokumenty\Android\Prestigio\doc\prestigio_notes.txt соответственно.

Это код, который я использовал (извините за копирование функции снова, но я хочу, чтобы это был полный и понятный класс):

class Program { static void Main(string[] args) { Console.WriteLine(GetTargetPath(@"D:\boot.lnk")); Console.WriteLine(GetTargetPath(@"D:\prestigio_notes.lnk")); Console.ReadLine(); } private static string GetTargetPath(string ShortcutPath) { string pathOnly = System.IO.Path.GetDirectoryName(ShortcutPath); string filenameOnly = System.IO.Path.GetFileName(ShortcutPath); Shell32.Shell shell = new Shell32.Shell(); Shell32.Folder folder = shell.NameSpace(pathOnly); Shell32.FolderItem folderItem = folder.ParseName(filenameOnly); if (folderItem != null) { Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; return link.Path; } return ""; // not found }
}

Убедитесь, что вы ссылаетесь на соответствующий COM-объект из списка доступных ссылок. Если это не удается, убедитесь, что у вас есть права на чтение из указанного места.

licensed under cc by-sa 3.0 with attribution.