2012-10-26 24 views
7

Eventuali duplicati:
Get target of shortcut folderCome ottengo il nome del percorso da un collegamento di file? Ottenere eccezione

Per esempio, in C:\TEMP\ ho un collegamento denominato test.dll il collegamento porterà al nome del file test.dll

voglio ottenere dalla scorciatoia solo il nome del percorso al file stesso. Quindi, sto chiamando questa funzione in un'altra funzione ricorsiva e metto in questa funzione ogni volta un'altra directory dal mio hard disk.

Ad esempio, la prima directory è C:\TEMP quindi in C:\TEMP c'è il file di collegamento che voglio ottenere il percorso solo per il file. Nel C:\TEMP per il test che ho ora 3 file:

hpwins23.dat
hpwmdl23.dat
hpwmdl23.dat - Shortcut (C:\TEMP\hpwmdl23.dat)

Quindi, quello che voglio ottenere è la nome percorso del collegamento in questo caso il suo C: \ TEMP

ho provato ad utilizzare questa funzione:

public 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); 
      if (folder == null) 
      { 
      } 
      else 
      { 
       FolderItem folderItem = folder.ParseName(filenameOnly); 
       if (folderItem != null) 
       { 
        Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
        return link.Path; 
       } 
      } 
      return string.Empty; 
     } 

ma quando sto usando la funzione e il suo arrivare a una scorciatoia sto ottenendo errore di eccezione sulla linea:

Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink //The exception is: NotImplementedException: The method or operation is not implemented 

cosa shoud faccio a risolverlo?

Questo è il messaggio di errore di eccezione completo:

System.NotImplementedException è stato catturato
Messaggio = Il metodo o operazione non è implementata.
Fonte = GatherLinks
StackTrace:
a Shell32.FolderItem.get_GetLink()
a GatherLinks.Form1.GetShortcutTargetFile(String shortcutFilename) in
D:\C-Sharp\GatherLinks\GatherLinks\GatherLinks\Form1.cs: line904
a GatherLinks.Form1.offlinecrawling

+0

Questo utente è più probabile che chiede di risolvere un collegamento simbolico (non una scorciatoia come in .lnk), nel qual caso non riuscirà questo codice. È necessario utilizzare "GetFinalPathNameByHandle()" con PInvoke. Il codice di esempio può essere trovato in questa [voce qui] (http://chrisbensen.blogspot.com/2010/06/getfinalpathnamebyhandle.html). – ykay

risposta

18

Per ottenere l'obiettivo di una (estensione .lnk file) di collegamento tu io l necessario prima di avere la COM oggetto seguente: Windows Script Host Object Model

Quindi, è possibile utilizzare WshShell (o WshShellClass) e IWshShortcut interfacce per ottenere l'obiettivo di un collegamento

Esempio

  string linkPathName = @"D:\Picrofo Autobot.lnk"; // Change this to the shortcut path 

      if (System.IO.File.Exists(linkPathName)) 
      { 
      // WshShellClass shell = new WshShellClass(); 
       WshShell shell = new WshShell(); //Create a new WshShell Interface 
       IWshShortcut link = (IWshShortcut)shell.CreateShortcut(linkPathName); //Link the interface to our shortcut 

       MessageBox.Show(link.TargetPath); //Show the target in a MessageBox using IWshShortcut 
      } 

Grazie ,
Spero di trovare utile :)


Puoi provare i seguenti passaggi per aggiungere Windows Script Host Object Model al progetto

  • Sotto Esplora soluzioni, Fare clic con il nome del progetto e selezionare Aggiungi riferimento
  • Selezionare la scheda COM da la finestra a comparsa
  • Sotto Nome componente, selezionare Oggetto modello host Script di Windows
  • Cliccare su OK
+0

Ho provato a leggere lnk-shortcut dal seguente percorso: C: \ ProgramData \ Microsoft \ Windows \ Menu Avvio \ Programmi \ StartUp \ shortcut.lnk e ottengo COMException: da HRESULT: 0x80020009 (DISP_E_EXCEPTION). Il mio sistema operativo: Win 8.1 x64 –

Problemi correlati