6

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

我尝试了这些,但它们返回了应用程序的位置。

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

7 回答 7

5

如果添加 COM 对象引用不成问题,请添加 COM 对象引用 - Windows 脚本宿主对象模型

我在我的桌面文件夹中运行了这段代码,它确实有效。对于当前文件夹使用 - 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/

于 2013-04-21T05:39:38.110 回答
4

根据 MSDN 中的进程 API 参考,STARTUPINFO给定进程的进程结构包含有关标题成员中的快捷方式 .lnk 文件的信息。在这种情况下,结构成员中存在一个标志dwFlags- 所以它似乎并不总是设置(我猜你是否直接运行 exe)

来自 MSDN:

STARTF_TITLEISLINKNAME:0x00000800

lpTitle 成员包含用户调用以启动此进程的快捷方式文件 (.lnk) 的路径。这通常由 shell 在调用指向已启动应用程序的 .lnk 文件时设置。大多数应用程序不需要设置此值。此标志不能与 STARTF_TITLEISAPPID 一起使用。

参考这里

于 2013-04-02T08:07:45.593 回答
1

试试这个:

Environment.CurrentDirectory

来自MSDN

获取或设置当前工作目录的标准路径。

于 2013-04-02T07:59:09.217 回答
1

我认为您将需要使用 COM 并添加对“Microsoft Shell 控制和自动化”的引用,如此博客文章中所述:

这是使用那里提供的代码的示例:

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));
        }
    }
}
于 2013-04-18T05:41:56.610 回答
0

使用 System.Reflection;

 string currentAssemblyDirectoryName = Path.GetDirectoryName(
                                        Assembly.GetExecutingAssembly()
                                                .Location
                                        );

对于 Web 应用程序,您也可以使用:

网络应用程序:

Request.PhysicalApplicationPath

http://msdn.microsoft.com/en-us/library/system.web.httprequest.physicalapplicationpath.aspx

抓住应用程序路径:)

于 2013-04-19T21:09:12.960 回答
0

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

Environment.CurrentDirectory

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

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

于 2013-04-20T02:49:18.590 回答
0

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

您可以将文件作为常规文本文件打开,在\x000 字符上拆分,然后检查生成的字符串数组。其中之一显然是链接目标:类似于"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+.*?"));
于 2019-05-15T08:13:14.870 回答