¿Cómo se obtiene el destino del directorio de una carpeta de acceso directo? Busqué en todas partes y solo encuentro el objetivo del archivo de acceso directo.Obtiene el destino de la carpeta de acceso directo
Respuesta
creo que tendrá que utilizar COM y agregar una referencia a "Control de Shell Microsoft y automatización", como se describe en this blog post:
Aquí hay un ejemplo usando el código siempre que:
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));
}
}
}
¡Gracias! Ahora solo tengo que averiguar cómo buscar una carpeta shortcuf programmaticaly :) –
Trabajo en Windows 7 64 bit, y falla al encontrar acceso directo a VirtualBox instalado en 'C: \ Program Files \ Oracle \ VirtualBoxOSX'. Siguió devolviendo el objetivo para estar en 'C: \ Archivos de programa (x86) \ Oracle \ VirtualBoxOSX \ VirtualBox.exe'. ¿Alguna explicación sobre este comportamiento? – swdev
El uso de Shell32 con este método solo permite la aplicación de un solo hilo. Debe incluir [STAThread] en el punto de entrada principal. Obtendrá excepción en las pruebas unitarias con este código porque la prueba unitaria no permite STAThread. ver [respuesta] (http://stackoverflow.com/questions/14543340/calling-shell32-dll-from-net-windows-service). También hay una solución para ejecutar este código en pruebas unitarias. Consulte http://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn
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 tenerlos en cuenta si es necesario.
. OP preguntó cómo obtener el directorio de destino del acceso directo, no cómo hacerlo. comprueba si es un atajo. –
Si no desea usar dependencias, puede usar https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/ Pero el formato de lnk no está documentado, por lo tanto, hágalo solo si comprende los riesgos.
si quiere encontrar su ruta de la aplicación que ha de acceso directo en el escritorio, una manera fácil de que yo uso, es el siguiente:
Process.GetCurrentProcess().MainModule.FileName.Substring(0, Process.GetCurrentProcess().MainModule.FileName.LastIndexOf("\\")
este código de retorno de cualquier camino exe que ejecuta, independientemente de que quien solicita el archivo
Una forma aún más simple para obtener la ruta vinculada que yo 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 será de descanso supuesto, si los cambios de formato LNK archivos.
en Windows 10 que necesita para hacer de este tipo, primero añada referencia COM a "Control de Shell Microsoft y automatización"
// 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);
}
}
- 1. Cambiar el destino de un acceso directo desde el símbolo del sistema
- 2. Acceso directo/Enlace a otra carpeta en TFS
- 3. Cómo establecer la carpeta de destino rpmbuild
- 4. Restringir el acceso directo a las páginas de error
- 5. Teclas de acceso directo Resharper
- 6. Acceso de cliente directo SimpleDB
- 7. ¿Seleccionar el destino de la carpeta en Java?
- 8. ReSharper acceso directo string.format
- 9. denegar el acceso directo a una carpeta y el archivo .htaccess por
- 10. Localizar en solución acceso directo a ReSharper
- 11. ¿Cómo configuro AppUserModelID en el acceso directo?
- 12. Acceso directo de clase parcial de grupo
- 13. Ejecutar como administrador el acceso directo desde el inicio
- 14. acceso directo resangrar en el texto sublime
- 15. cómo detectar cuando una tecla de acceso directo (tecla de acceso directo) se presiona
- 16. Crear acceso directo en el escritorio C#
- 17. C++ plantilla de macro de acceso directo
- 18. .htaccess para restringir el acceso a la carpeta
- 19. ¿Cómo creo una carpeta de acceso directo en un servidor web de Linux?
- 20. Acceso a la ruta de destino desde un archivo de acceso directo en un sistema de 64 bits utilizando la aplicación de 32 bits
- 21. Proteger archivo PHP de acceso directo
- 22. acceso directo para ejecutar ensayos de hormigón
- 23. de acceso directo para iniciar una actividad
- 24. Tecla de acceso directo usando C#
- 25. Rubí signo de colon acceso directo
- 26. Crear un acceso directo de escritorio a una CARPETA existente usando WiX
- 27. ¿Cómo cambiar la carpeta de destino del paquete en CPack?
- 28. Acceso directo nulo en Delphi
- 29. acceso directo para crear matriz de caracteres
- 30. (htaccess) ¿Cómo prevenir un archivo de ACCESO DIRECTO a URL?
esto no se relaciona con WPF en absoluto, me quita la etiqueta –
Este es el solución que prefiero: [¿Cómo obtengo el nombre de ruta de un acceso directo a archivos?] (http://stackoverflow.com/a/13079688/3757210) – ilcorvo