2014-01-26 4 views
0

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

Это мой код: (взял из: 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 \ Роуминг \ Microsoft \ Office \ Недавние

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

EDIT

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

+0

Я считаю, что вам необходимо использовать службы COM Interop для успешного использования компонентов Shell32.dll. У меня никогда не было причин использовать его, хотя я не хочу указывать вас слишком далеко в неправильном направлении. Вот статья MSDN для COM-переходов: http://msdn.microsoft.com/en-us/library/aa645712(v=vs.71).aspx – JNYRanger

+0

Вы просто хотите знать, существует ли файл или нет? – wruckie

ответ

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 из список доступных ссылок. Если это не удается, убедитесь, что у вас есть права на чтение из указанного места.

+0

Вы правы, теперь мой код волшебным образом работает, .. Спасибо вам, в любом случае! – Aviv

Смежные вопросы