如何以编程方式跟踪. link文件
本文关键字:跟踪 link 文件 方式 编程 | 更新日期: 2023-09-27 18:19:02
我们有一个充满快捷键(. link文件)的网络驱动器,这些快捷键指向文件夹,我需要在c# Winforms应用程序中以编程方式遍历它们。
我有哪些实用的选项?
添加iwshrinktimelibrary作为项目的引用。添加参考,COM选项卡,Windows脚本主机对象模型。
下面是获取快捷键属性的方法:IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass();
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename);
快捷方式对象"sc"有一个TargetPath属性
如果您不希望引用COM,并与您的产品一起分发Interop. iwtimelibrlibrary .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;
}
}
}
我知道这不是正确的方式,链接文件结构可以改变等,但这就是我所做的:
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);
}
- 使用COM IPersistFile接口加载文件
- 对结果执行QueryInterface,将其转换为IShellLink接口。
- 调用IShellLink: GetPath
据我所知,你可以让。net生成符合这些接口的类,使用"添加引用"对话框。
IShellLink接口允许您操作. link文件,尽管在c#中使用它有点麻烦。
本文有一些实现必要的互操作库的代码。
您可以在这里找到文章中的代码,但该页面似乎无法在Firefox中工作。