如何取得控制台应用的执行目录

我试图用下面的代码找到控制台应用的目录,

Assembly.GetExecutingAssembly().Location

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

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

117919 次浏览

使用 Environment.CurrentDirectory

获取或设置当前工作目录的完全限定路径。
(MSDN 当前目录属性)

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

如果应用程序在 C: Foo Bar中运行,则 logsDirectory将指向 C: Foo Bar 日志

最安全的方法:

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

用这个:

System.Reflection.Assembly.GetExecutingAssembly().Location

再加上

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

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

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");

Scott Hanselman 的 博客文章是这样的:

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,它对我很有用。