8

.lnk ファイルのバイナリ コンテンツを読み取りたいです。ショートカットのターゲット (lnk ファイル) が存在する限り、これは IO.File.ReadAllBytes(string file) で正常に機能します。

しかし

ショートカットのターゲットが存在しない場合 (私はこれが欲しいと信じています)、メソッドはゼロのみを返します。これは、OSがリンクをたどり、存在しない場合はゼロを返すためだと思います

フレームワークが .lnk ファイルの内容を表示する前に .lnk のターゲットに従うという事実を回避する方法はありますか?

4

3 に答える 3

23

あまり意味がありません。簡単に確認する方法がありません。最善の方法は、.lnk ファイルを本来の方法で読み取ることだと思います。これには COM を使用できます。ShellLinkObject クラスは IShellLink インターフェイスを実装します。[プロジェクト] + [参照の追加]、[参照] タブから始めて、c:\windows\system32\shell32.dll に移動します。これにより、相互運用ライブラリが生成されます。次のようなコードを記述します。

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;
}
于 2010-04-02T09:52:51.350 に答える
0

ReadAllBytes が OS に lnk をたどらせてターゲットに到達させるとは思えません。OS は既に lnk ファイルを解決していると思われます (おそらく、Windows エクスプローラーでファイルを参照したとき)。

于 2010-04-02T09:23:43.873 に答える
0

ファイルが別のマシン (私はサーバー 2008 r2 を使用しています) からコピーされたため、ファイルがロックされていたことがわかりました。

愚かな私。

于 2010-04-11T13:58:35.160 に答える