微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenFileDialog.DereferenceLinks 不起作用

如何解决OpenFileDialog.DereferenceLinks 不起作用

我想从快捷方式中获取 exe 的目标路径。使用 DereferenceLinks 这看起来很简单,但它不起作用。我什至在尝试 Path.GetDirectoryName 并检查 DereferenceLinks 和 ShowDialog() 是否为真。

OpenFileDialog o = new OpenFileDialog();
o.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
o.Title = "Select the game's exe file or shortcut file";
o.Filter = "Executable or Shortcut (*.exe,*.lnk) | *.exe; *.lnk";
o.DereferenceLinks = true;
if ((bool)o.ShowDialog() && o.DereferenceLinks == true)
{
    Debug.WriteLine("o.SafeFileName: " + o.SafeFileName);
    Debug.WriteLine("o.FileName: " + o.FileName);
    Debug.WriteLine("Path.GetDirectoryName(o.SafeFileName): " + Path.GetDirectoryName(o.SafeFileName));
    Debug.WriteLine("Path.GetDirectoryName(o.FileName): " + Path.GetDirectoryName(o.FileName));
}

还不能发布图片,所以这是在桌面上选择游戏快捷方式后的调试输出。游戏的 exe 不在桌面上,而且文件名显然仍在引用 lnk 文件

  • o.SafeFileName:Planescape - Torment - 增强版.lnk
  • o.FileName: C:\Users\keeflomane\Desktop\Planescape - Torment - Enhanced Edition.lnk
  • Path.GetDirectoryName(o.SafeFileName):
  • Path.GetDirectoryName(o.FileName): C:\Users\keeflomane\Desktop

我做错了什么?我是不是不理解 DereferenceLinks 的用途?

解决方法

您没有取消引用文件名的原因是 *.lnk 文件有一个显式过滤器。
因此,如果您从过滤器中删除 *.lnk,您仍将获得 exe 文件的快捷方式文件,而 FileName 将返回快捷方式文件的目标。

o.Filter = "Executable or Shortcut (*.exe,*.lnk) | *.exe";

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。