如何获取控制台应用程序的执行目录
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 的目录。所以这是正确的答案...以上是关于如何获取控制台应用程序的执行目录的主要内容,如果未能解决你的问题,请参考以下文章