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

eug*_*neK 57 .net c# filepath

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

Assembly.GetExecutingAssembly().Location
Run Code Online (Sandbox Code Playgroud)

但是这个给了我汇编所在的位置.这可能与我执行应用程序的位置不同.

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

Ste*_*fan 90

使用Environment.CurrentDirectory.

获取或设置当前工作目录的标准路径.
(MSDN Environment.CurrentDirectory属性)

string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs");
Run Code Online (Sandbox Code Playgroud)

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

  • 当前目录与包含当前可执行文件的目录不同. (21认同)

Sun*_*nny 29

用这个 :

System.Reflection.Assembly.GetExecutingAssembly().Location
Run Code Online (Sandbox Code Playgroud)

结合它

System.IO.Path.GetDirectoryName if all you want is the directory.
Run Code Online (Sandbox Code Playgroud)

  • 如果我使用在计划任务下运行的 Environment.CurrentDirectory,它将转到 C:\Windows\system32\log 这不是执行路径。然后我使用这个 System.Reflection.Assembly.GetExecutingAssembly().Location,它指向我正确的 exe 执行路径。谢谢! (2认同)

Mic*_*ida 17

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)}");
        }
    }
Run Code Online (Sandbox Code Playgroud)

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


dts*_*tsg 6

最安全的方式:

string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
Run Code Online (Sandbox Code Playgroud)

  • CodeBase是找到文件的地方的URL,而Location是实际加载文件的路径.例如,如果程序集是从Internet下载的,则其CodeBase可能以"http://"开头,但其位置可能以"C:\"开头.如果文件是阴影复制的,则Location将是shadow-copy目录中文件副本的路径.知道不保证为GAC中的程序集设置CodeBase也是很好的.但是,将始终为从磁盘加载的程序集设置位置. (4认同)
  • 确保文件在磁盘上,我使用此版本来获取"常规"路径而不是`file://`路径:`Path.GetDirectoryName(new Uri(this.GetType().Assembly.GetName()).基本代码).LocalPath)` (2认同)