.NET读取.lnk文件的二进制内容

我想读取.lnk文件的二进制内容。 只要快捷方式(lnk文件)的目标存在,这对IO.File.ReadAllBytes(字符串文件)工作正常。

如果快捷方式的目标不存在(相信我,我想要这个),该方法只返回零。 我想这是因为操作系统遵循链接,如果它不存在则返回零

有没有办法绕过框架在显示.lnk文件的内容之前遵循.lnk目标的事实?

它没有多大意义,没有一个简单的方法来检查它。 我认为最好的方法是按照应该读取的方式读取.lnk文件。 您可以使用COM来执行此操作, ShellLinkObject类实现IShellLink接口。 开始使用Project + Add Reference,Browse选项卡并导航到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; } 

我不相信ReadAllBytes会让操作系统跟随lnk到达目标。 我怀疑,操作系统已经解析了lnk文件(可能是你在Windows资源管理器中浏览文件时)。

原来这个文件被锁定了,因为它是从另一台机器复制的(我正在使用服务器2008 r2)解锁它返回了预期的行为。

愚蠢的我。