如何获取应用程序快捷方式的当前目录路径

7

我想获取当前目录路径,但不是应用程序位置,而是它的快捷方式位置。

我尝试了以下方法,但它们返回的是应用程序的位置。

Directory.GetCurrentDirectory();
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase);
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

“快捷方式位置”是指指向实际*.exe文件的实际*.lnk文件吗? - psubsee2003
我不知道它的扩展名是否为.ink,但是它是一个指向实际.exe文件的文件。 - a1204773
在Windows机器上,扩展名为*.lnk。 - psubsee2003
是的,在这个例子中。我假设如果它对一个人起作用,那么它对更多人也会起作用。 - a1204773
@psubsee2003 因为我会告诉用户这样做。实际上,该程序获取快捷方式位置的文件夹名称,在Google上搜索并获取Google搜索的第一页,并将其写入同一文件夹中的HTML文件。 - a1204773
显示剩余5条评论
8个回答

6
根据MSDN中的进程API参考,给定进程的STARTUPINFO结构包含有关标题成员中的快捷方式.lnk文件的信息。在dwFlags结构成员中存在一个标志,当出现这种情况时设置该标志-因此看起来并不总是设置(如果您直接运行exe,则猜测)。
来自MSDN:
STARTF_TITLEISLINKNAME:0x00000800 lpTitle成员包含启动此进程的用户调用的快捷方式文件(.lnk)的路径。当调用指向启动应用程序的.lnk文件时,通常由shell设置此值。大多数应用程序不需要设置此值。此标志不能与STARTF_TITLEISAPPID一起使用。 参考文献在此处

4

如果添加COM对象引用不是问题,则可以添加COM对象引用 -Windows Script Host Object Model。

我在我的桌面文件夹中运行了这段代码,它可以正常工作。如果要使用当前文件夹,请使用- Environment.CurrentDirectory

using System;
using System.IO;
using IWshRuntimeLibrary;  //COM object -Windows Script Host Object Model

namespace csCon
{
    class Program
    {
        static void Main(string[] args)
        {
            // Folder is set to Desktop 
            string dir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            var di = new DirectoryInfo(dir);
            FileInfo[] fis = di.GetFiles();
            if (fis.Length > 0)
            {
                foreach (FileInfo fi in fis)
                {
                    if (fi.FullName.EndsWith("lnk"))
                    {
                        IWshShell shell = new WshShell();
                        var lnk = shell.CreateShortcut(fi.FullName) as IWshShortcut;
                        if (lnk != null)
                        {
                            Console.WriteLine("Link name: {0}", lnk.FullName);
                            Console.WriteLine("link target: {0}", lnk.TargetPath);
                            Console.WriteLine("link working: {0}", lnk.WorkingDirectory);
                            Console.WriteLine("description: {0}", lnk.Description);
                        }

                    }
                }
            }
        }
    }
}

这里输入图像描述

论坛提供的代码参考: http://www.neowin.net/forum/topic/658928-c%23-resolve-lnk-files/


这个答案可以从Windows桌面找到一个快捷方式,但是无法找到实际启动程序的快捷方式。 - Dwedit

1

我认为你需要使用COM并添加对“Microsoft Shell Control And Automation”的引用,如this博客文章所述:

以下是使用该代码提供的示例:

namespace Shortcut
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using Shell32;

    class Program
    {
        public static string GetShortcutTargetFile(string shortcutFilename)
        {
            string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
            string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);

            Shell shell = new Shell();
            Folder folder = shell.NameSpace(pathOnly);
            FolderItem folderItem = folder.ParseName(filenameOnly);
            if (folderItem != null)
            {
                Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
                return link.Path;
            }

            return string.Empty;
        }

        static void Main(string[] args)
        {
            const string path = @"C:\link to foobar.lnk";
            Console.WriteLine(GetShortcutTargetFile(path));
        }
    }
}

1
我觉得你没有理解我的问题...假设我有一个exe文件,并在一个文件夹中创建了一个快捷方式...当我运行快捷方式时,我希望它显示快捷方式的位置。 - a1204773

1

试试这个:

Environment.CurrentDirectory

来自MSDN:

获取或设置当前工作目录的完全限定路径。


1
这不会返回应用程序路径而不是快捷方式路径吗? - psubsee2003
这个链接从相反的角度解释了如何获取程序集目录,它进一步阐述了当运行安装时,Environment.CurrentDirectory产生意外结果的原因。 - jordanhill123
根据 OP 代码中使用的位置,当前目录可能不是快捷方式目录位置。他必须在程序开始执行时立即调用此函数,并希望没有其他程序更改它,因为 Environment.CurrentDirectory 是一个开放给所有应用程序更改的环境变量。 - jordanhill123

0

1
这将获取程序集目录的路径,而不是包含启动应用程序的快捷方式的目录的路径。 - Spooky

0

由于创建快捷方式是工作流程的一部分,只需将工作目录设置为“%cd%”,然后在应用程序中使用:

Environment.CurrentDirectory

显然,在您的应用程序调用任何代码之前,您希望捕获此值。

在使用Windows资源管理器创建快捷方式时,您没有设置工作目录的选项。因此,在创建后,通过右键单击它并选择“属性”来打开其属性页面,然后将开始于字段设置为%cd%。创建此类快捷方式后,您可以将其移动或复制到要运行应用程序的文件夹中。


0

如果您不想使用其他答案中建议的COM对象

您可以将文件作为常规文本文件打开,拆分\x00 0字符,并检查生成的字符串数组。其中一个显然是链接目标:类似于"C:\path\to\file"或在UNC的情况下"\\computers\path\to\file"

string lnkFilePath  "...";

var file = System.IO.File.ReadAllText(lnkFilePath);
var contents = Regex.Split(file, "[\x00]+");
var paths = contents.Where(line => Regex.IsMatch(line, @"^([A-Z]:\\|^\\\\)\S+.*?"));

0
使用GetStartupInfoW,它会告诉你启动程序的.lnk文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接