我们有一个充满快捷方式(.lnk文件)的网络驱动器,指向文件夹,我需要在C#Winforms应用程序中以编程方式遍历它们。
我有哪些实用选项?
答案 0 :(得分:13)
添加IWshRuntimeLibrary作为项目的参考。添加引用,COM选项卡,Windows脚本主机对象模型。
以下是我获取快捷方式属性的方法:
IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);
快捷方式对象“sc”具有TargetPath属性。
答案 1 :(得分:1)
如果您不想引用COM,并将Interop.IWshRuntimeLibrary.dll与您的产品一起分发(记住Jay Riggs" Embed Interop Types":False)
您可以改用新的动态COM。
private void Window_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
dynamic shortcut;
dynamic windowsShell;
try
{
var file = files[0];
if (Path.GetExtension(file)?.Equals(".lnk",StringComparison.OrdinalIgnoreCase) == true)
{
Type shellObjectType = Type.GetTypeFromProgID("WScript.Shell");
windowsShell = Activator.CreateInstance(shellObjectType);
shortcut = windowsShell.CreateShortcut(file);
file = shortcut.TargetPath;
// Release the COM objects
shortcut = null;
windowsShell = null;
}
//
// <use file>...
//
}
finally
{
// Release the COM objects
shortcut = null;
windowsShell = null;
}
}
}
答案 2 :(得分:0)
据我所知,你可以使用&#34; Add Reference&#34;来生成符合每个接口的.NET生成类。对话框。
答案 3 :(得分:0)
IShellLink界面允许您操作.lnk文件,尽管从C#中使用它会有点痛苦。
This article有一些代码实现了必要的互操作gubbins。
<强>更新强>
您可以找到文章here中的代码,但该网页似乎无法在Firefox中使用。它确实在IE中工作。
答案 4 :(得分:0)
我知道这不是正确的方法,lnk文件结构可以改变等等,但这就是我所做的:
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);
}