Obtener el objective de la carpeta de acceso directo

¿Cómo se obtiene el objective de directorio de una carpeta de acceso directo? Busqué en todas partes y solo encuentro el objective del archivo de acceso directo.

Creo que deberá usar COM y agregar una referencia a “Microsoft Shell Control And Automation”, como se describe en esta publicación de blog :

Aquí hay un ejemplo usando el código proporcionado allí:

namespace Shortcut { using System; using System.Diagnostics; using System.IO; using Shell32; class Program { public static 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); FolderItem folderItem = folder.ParseName(filenameOnly); if (folderItem != null) { Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; return link.Path; } return string.Empty; } static void Main(string[] args) { const string path = @"C:\link to foobar.lnk"; Console.WriteLine(GetShortcutTargetFile(path)); } } } 

En Windows 10, debe hacerse así, primero agregue la referencia COM a “Microsoft Shell Control And Automation”

 // new way for windows 10 string targetname; string pathOnly = System.IO.Path.GetDirectoryName(LnkFileName); string filenameOnly = System.IO.Path.GetFileName(LnkFileName); Shell shell = new Shell(); Shell32.Folder folder = shell.NameSpace(pathOnly); FolderItem folderItem = folder.ParseName(filenameOnly); if (folderItem != null) { Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; targetname = link.Target.Path; // <-- main difference if (targetname.StartsWith("{")) { // it is prefixed with {54A35DE2-guid-for-program-files-x86-QZ32BP4} int endguid = targetname.IndexOf("}"); if (endguid > 0) { targetname = "C:\\program files (x86)" + targetname.Substring(endguid + 1); } } 

Si no desea usar dependencias, puede usar https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/. Pero el formato lnk no está documentado, por lo tanto, hágalo solo si entiendes los riesgos

si quiere encontrar la ruta de acceso de la aplicación que tiene accesos directos en el escritorio, una manera fácil que uso es la siguiente:

 Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\") 

este código devuelve cualquier ruta exe que se esté ejecutando, independientemente de quién solicitó el archivo

Una forma aún más simple de obtener la ruta vinculada que uso es:

 private static string LnkToFile(string fileLink) { string link = File.ReadAllText(fileLink); int i1 = link.IndexOf("DATA\0"); if (i1 < 0) return null; i1 += 5; int i2 = link.IndexOf("\0", i1); if (i2 < 0) return link.Substring(i1); else return link.Substring(i1, i2 - i1); } 

Pero, por supuesto, se romperá si cambia el formato del archivo lnk.

Gracias a la respuesta de Mohsen.Sharify obtuve un código más claro :

 var fileName = Process.GetCurrentProcess().MainModule.FileName; var folderName = Path.Combine(fileName, ".."); //origin folder 

Todos los accesos directos a archivos tienen una extensión de archivo .lnk que puede verificar. Usando una cadena por ejemplo, puede usar string.EndsWith (“. Lnk”) como un filtro.

Todos los accesos directos de URL tienen una extensión de archivo .url, por lo que tendrá que contarlos también si es necesario.

    Intereting Posts