Question Obtenir la cible du dossier de raccourci


Comment obtenez-vous la cible de répertoire d'un dossier de raccourci? J'ai une recherche partout et ne trouve que la cible du fichier de raccourci.


14
2018-02-23 13:37


origine


Réponses:


Je pense que vous devrez utiliser COM et ajouter une référence à "Microsoft Shell Control And Automation", comme décrit dans ce billet de blog:

Voici un exemple utilisant le code fourni ici:

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));
        }
    }
}

22
2018-02-23 14:00



Dans Windows 10, il faut faire comme ça, ajouter d'abord la référence COM à "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);
  }
}

2
2018-05-05 13:30



Si vous ne voulez pas utiliser de dépendances, vous pouvez utiliser https://blez.wordpress.com/2013/02/18/get-file-shortcuts-target-with-c/ Mais le format lnk n'est pas documenté, alors ne le faites que si vous comprenez les risques.


1
2018-04-20 13:49



Si vous voulez trouver votre chemin d’application avec un raccourci sur le bureau, voici un moyen simple:

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

ce code retourne tout chemin exe en cours d'exécution, quel que soit celui qui a demandé le fichier


1
2018-01-30 08:41



Un moyen encore plus simple d'obtenir le chemin lié que j'utilise est:

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);
}

Mais il faudra bien sûr que le format du fichier lnk change.


1
2017-12-07 09:53



Grâce à La réponse de Mohsen.Sharify J'ai un morceau de code plus soigné:

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

0
2018-04-11 08:01



Tous les raccourcis de fichiers ont une extension de fichier .lnk que vous pouvez vérifier. En utilisant une chaîne par exemple, vous pouvez utiliser string.EndsWith (".lnk") comme filtre.

Tous les raccourcis URL ont une extension de fichier .url, vous devrez donc en tenir compte si nécessaire.


-2
2017-07-04 02:00