2012-02-23 2 views
14

にするには?私はどこでも検索して、ショートカットファイルのターゲットしか見つけません。ショートカットフォルダのディレクトリターゲットを取得するにはどうすればよいのショートカットフォルダのターゲット

+1

、私はこれはタグ –

+0

を削除ソリューション私が好む:[私は、ファイルのショートカットからパス名を取得する方法は?](http://stackoverflow.com/a/13079688/3757210) – ilcorvo

答えて

22

私はあなたがCOMを使用してthis blog postで説明したように、「マイクロソフトシェル制御およびオートメーション」への参照を追加する必要がありますと思う:

ここであったコードを使用した例です:

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

ありがとう!今、私はちょうどprogrammaticaly shortcufフォルダを探すために方法を見つける必要がある:) –

+2

私はWindows 7の64ビットで動作し、それは 'CにインストールされたVirtualBoxへのショートカット見つけることに失敗した:\プログラムファイル\オラクル\ VirtualBoxOSX'を。ターゲットは 'C:¥Program Files(x86)¥Oracle¥VirtualBoxOSX¥VirtualBox.exe'に戻りました。この動作に関する説明はありますか? – swdev

+0

この方法でShell32を使用すると、単一スレッドアプリケーションでのみ使用できます。メインエントリポイントに[STAThread]を含める必要があります。ユニットテストではSTAThreadが許可されていないため、このコードでユニットテストで例外が発生します。 [解答](http://stackoverflow.com/questions/14543340/calling-shell32-dl​​l-from-net-windows-service)を参照してください。解決策は、ユニットテストでこのコードを実行することもありますhttp://haacked.com/archive/2014/11/20/xunit-and-sta/ – yancyn

-2

すべてのファイルショートカットには、.lnkファイル拡張子があります。たとえば、文字列を使用すると、string.EndsWith( ".lnk")をフィルタとして使用できます。あなたが必要な場合にも、それらを考慮する必要がありますので、

すべてのURLのショートカットは、た.urlファイル拡張子を持っています。

+1

OPはありませんどのように、ショートカットのターゲットディレクトリを取得する方法を尋ね参照してくださいショートカットかどうか確認してください。 –

0

あなたがデスクトップ上にショートカットしているアプリケーションのパス、私が使用して簡単な方法を見つけたい場合は、以下の通りです:

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

このコードの復帰誰がファイルを要求していることに関係なく、実行されている任意のexeファイルのパス

1

さらに簡単な方法は、私が使用してリンクのパスを取得します

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

をしかし、それは当然の休憩の意志LNKファイル形式が変更された場合。窓10で

2

それは、これがすべてでWPFに関するしません。このように行われる必要があり、最初の「Microsoftシェルの制御およびオートメーション」にCOM参照を追加

// 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); 
    } 
} 
関連する問題