如何获取控制台应用程序的执行目录

Posted

技术标签:

【中文标题】如何获取控制台应用程序的执行目录【英文标题】:How to get execution directory of console application 【发布时间】:2012-06-15 03:53:05 【问题描述】:

我尝试使用以下代码获取控制台应用程序的目录,

Assembly.GetExecutingAssembly().Location

但是这个给了我组装所在的位置。这可能与我执行应用程序的位置不同。

我的控制台应用程序解析没有参数的日志。它必须转到可执行文件文件夹内的logs/ 文件夹,或者如果我给它一个到logs/ 的路径,它会解析它。

【问题讨论】:

看看这个问题:***.com/questions/674857/… 【参考方案1】:

Scott Hanselman 有一个 blog post,其中包含以下内容:

using System;
using System.Diagnostics;
using System.IO;
 
namespace testdir

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine($"Launched from Environment.CurrentDirectory");
            Console.WriteLine($"Physical location AppDomain.CurrentDomain.BaseDirectory");
            Console.WriteLine($"AppContext.BaseDir AppContext.BaseDirectory");
            Console.WriteLine($"Runtime Call Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)");
        
    

他在 .NET Core 3.1 中使用它,但是,我正在运行 .NET 4.8,它对我有用。

【讨论】:

【参考方案2】:

这是一个简单的日志记录方法

using System.IO;
private static void logWrite(string filename, string text)

    string filepath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\" + filename;

    using (StreamWriter sw = File.AppendText(filepath))
    
        sw.WriteLine(text);
        Console.WriteLine(text);
    

用法:

logWrite("Log.txt", "Test");

【讨论】:

【参考方案3】:

最安全的方法:

string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

【讨论】:

CodeBase 是指向文件所在位置的 URL,而 Location 是实际加载文件的路径。例如,如果程序集是从 Internet 下载的,则其 CodeBase 可能以“http://”开头,但其 Location 可能以“C:\”开头。如果文件是影子复制的,则 Location 将是影子复制目录中文件副本的路径。也很高兴知道 CodeBase 不能保证为 GAC 中的程序集设置。但是,将始终为从磁盘加载的程序集设置位置。 确保文件在磁盘上,我使用此版本来获取“常规”路径而不是 file:// 路径:Path.GetDirectoryName(new Uri(this.GetType().Assembly.GetName().CodeBase).LocalPath)【参考方案4】:

使用这个:

System.Reflection.Assembly.GetExecutingAssembly().Location

结合

System.IO.Path.GetDirectoryName if all you want is the directory.

【讨论】:

如果我使用在计划任务下运行的 Environment.CurrentDirectory,它将转到不是执行路径的 C:\Windows\system32\log。然后我使用这个 System.Reflection.Assembly.GetExecutingAssembly().Location,它指向我正确的 exe 执行路径。谢谢! 这在单元测试或运行本地 IIS 的 Web 项目中可能无法正常工作。 CodeBase 答案可以。【参考方案5】:

使用Environment.CurrentDirectory

获取或设置当前工作目录的完全限定路径。 (MSDNEnvironment.CurrentDirectory Property)

string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs");

如果您的应用程序在 c:\Foo\Bar 中运行,logsDirectory 将指向 c:\Foo\Bar\logs

【讨论】:

当前目录与包含当前可执行文件的目录不同。 Environment.CurrentDirectory 是一个值,它可以并且将在运行应用程序的过程中发生变化。例如,使用默认参数,WinForms 中的 OpenFileDialog 会将此值更改为从中选择文件的目录 @KFL 是的,但是 OP 似乎想要执行 exe 的目录。所以这是正确的答案...

以上是关于如何获取控制台应用程序的执行目录的主要内容,如果未能解决你的问题,请参考以下文章

JVM崩溃。如何获取错误日志或核心转储

用Java如何实现获取linux控制台的输出(分很多)

c# 如何获取项目的根目录

c# 如何获取项目的根目录

如何在java中获取执行目录路径[重复]

如何获取执行程序的当前路径