2010-04-02 14 views
6

Quiero leer el contenido binario de un archivo .lnk. Mientras exista el destino del atajo (archivo lnk), esto funciona bien con IO.File.ReadAllBytes (archivo de cadena)..NET lee los contenidos binarios del archivo .lnk

PERO

Si no existe el destino del acceso directo (crea que yo quiero esto) el método sólo devuelve cero de. Supongo que esto se debe a que el sistema operativo sigue el enlace y si no existe, devuelve cero

¿Hay alguna forma de eludir el hecho de que el marco sigue el objetivo de .lnk antes de mostrar el contenido del archivo .lnk ?

Respuesta

0

Resulta que el archivo se ha bloqueado porque se ha copiado de otra máquina (estoy usando Server 2008 R2) desbloquear volvió a la behavoir esperado.

Estúpido.

0

No creo que ReadAllBytes induce al sistema operativo a seguir el lnk hasta su objetivo. Sospecho que el sistema operativo ya resolvió el archivo lnk (tal vez cuando buscó en el archivo en el Explorador de Windows).

+0

Es un acceso directo publicitado de otra computadora, por lo que el enlace nunca se puede resolver – Flores

18

No tiene mucho sentido, no tiene una manera fácil de verificarlo. Creo que el mejor enfoque es leer el archivo .lnk de la forma en que se supone que debe leerse. Puede usar COM para hacerlo, el ShellLinkObject class implementa la interfaz IShellLink. Comience con Project + Agregar referencia, pestaña Examinar y navegue hasta c: \ windows \ system32 \ shell32.dll. Eso genera una biblioteca de interoperabilidad. Escribir código como este:

public static string GetLnkTarget(string lnkPath) { 
    var shl = new Shell32.Shell();   // Move this to class scope 
    lnkPath = System.IO.Path.GetFullPath(lnkPath); 
    var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath)); 
    var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath)); 
    var lnk = (Shell32.ShellLinkObject)itm.GetLink; 
    return lnk.Target.Path; 
} 
+0

Buen fragmento. Por cierto, cuando usé esto tuve que cambiar la última línea para devolver lnk.Target.Path. –

+0

En realidad, la última línea debe ser return lnk.Path –

+0

¡Funciona incluso con diacríticos! – qub1n

Cuestiones relacionadas