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

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

Это мой код: (взято с: 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.