【发布时间】:2012-06-15 03:53:05
【问题描述】:
我尝试使用以下代码获取控制台应用程序的目录,
Assembly.GetExecutingAssembly().Location
但是这个给了我组装所在的位置。这可能与我执行应用程序的位置不同。
我的控制台应用程序解析没有参数的日志。它必须转到可执行文件文件夹内的logs/ 文件夹,或者如果我给它一个到logs/ 的路径,它会解析它。
【问题讨论】:
我尝试使用以下代码获取控制台应用程序的目录,
Assembly.GetExecutingAssembly().Location
但是这个给了我组装所在的位置。这可能与我执行应用程序的位置不同。
我的控制台应用程序解析没有参数的日志。它必须转到可执行文件文件夹内的logs/ 文件夹,或者如果我给它一个到logs/ 的路径,它会解析它。
【问题讨论】:
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,它对我有用。
【讨论】:
这是一个简单的日志记录方法
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");
【讨论】:
最安全的方法:
string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
【讨论】:
file:// 路径:Path.GetDirectoryName(new Uri(this.GetType().Assembly.GetName().CodeBase).LocalPath)
使用这个:
System.Reflection.Assembly.GetExecutingAssembly().Location
结合
System.IO.Path.GetDirectoryName if all you want is the directory.
【讨论】:
CodeBase 答案可以。
使用Environment.CurrentDirectory。
获取或设置当前工作目录的完全限定路径。
(MSDNEnvironment.CurrentDirectory Property)
string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs");
如果您的应用程序在 c:\Foo\Bar 中运行,logsDirectory 将指向 c:\Foo\Bar\logs。
【讨论】: