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

时间:2013-04-02 07:56:52

标签: c# console-application

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

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

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

7 个答案:

答案 0 :(得分: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);
                        }

                    }
                }
            }
        }
    }
}

enter image description here

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

答案 1 :(得分:4)

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

来自MSDN:

  

STARTF_TITLEISLINKNAME:0x00000800

     

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

Reference here

答案 2 :(得分:1)

试试这个:

Environment.CurrentDirectory

来自MSDN

  

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

答案 3 :(得分: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));
        }
    }
}

答案 4 :(得分: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

绘制应用程序路径图:)

答案 5 :(得分:0)

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

Environment.CurrentDirectory

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

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

答案 6 :(得分: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+.*?"));