C#可执行执行执行目录

C#可执行执行执行目录,c#,C#,获取C可执行文件运行路径的最佳方法是什么 我需要将其用于临时文件夹等,目前我正在使用: Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) 但我需要做一个: .Replace("file:\\", string.Empty) 因为这给了我一个URI类型的路径(即在开始时有文件:\n),这在我的代码的某些其他部分中是不可用的。请尝试: Path.GetDirectoryName(Assembly.G

获取C可执行文件运行路径的最佳方法是什么

我需要将其用于临时文件夹等,目前我正在使用:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)
但我需要做一个:

.Replace("file:\\", string.Empty)
因为这给了我一个URI类型的路径(即在开始时有文件:\n),这在我的代码的某些其他部分中是不可用的。

请尝试:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)

它应该返回没有可执行文件名的路径。

尝试使用
环境。CurrentDirectory

这将返回当前工作目录的文件夹。

对于临时文件夹等。出于安全原因,不应使用正在执行的目录。。。 MS内置了以下功能:

您可以从
环境中使用
ApplicationData
(适用于漫游用户)或
LocalApplicationData
(适用于非漫游用户)或
CommonApplicationData
(适用于非用户相关内容)。SpecialFolder
-任何内容(文件+文件夹)您在这些文件夹中创建的文件夹已设置为具有运行您的应用程序的用户所需的权限/权限-没有其他人(可能除了管理员)可以访问这些文件夹。。。为了使它更安全,你可以加密你放在那里的数据


请参见

对于您的问题,答案并不准确,但我建议您看看:

Path.GetTempFileName()

字符串executableLocation=Path.GetDirectoryName(Assembly.getExecutionGassembly().Location);
字符串txtfile=Path.Combine(executableLocation,“example.txt”)

如果程序集已被卷影复制,则
assembly.Location
将指向dll的卷影副本

如果您想知道生成输出目录的位置,请使用
Assembly.CodeBase
,即:

Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath)
如果您想从程序集目录中访问其他资源,例如在运行测试套件时,此功能非常有用。

  • .NET Core 3.0引入了
    IHostEnvironment.ContentRootPath
  • .NET Core 2.1引入了
    IHostingEnvironment.ContentRootPath
    (自Core 3.0以来已过时)
就个人而言,我发现这些是我通常需要的:包含内容的位置


我可以确认当作为单元测试运行时,
IHostEnvironment.ContentRootPath
也会返回所需的结果。(使用xUnit进行测试,但测试框架应该无关紧要。)

我认为这是正确的答案。临时文件应转到临时文件夹。这就是它的用途。
Application.StartupPath
仅适用于WinForms(即:通过引用System.Windows.Forms程序集)。。是的,忘了在你的评论中提到@wasatchwizard,+1。这是获取任何c#项目(winforms、wpf、console等)的可执行文件路径的唯一可靠方法,当然也是对原始问题的最佳答案。但是,在这种情况下,听起来确实应该使用ApplicationData中特定于应用程序的文件夹。我会避免使用临时目录,除非它是真正临时的(即:文件不会被使用超过几秒钟或在特定过程中)。。我定期清理临时文件夹。为什么需要“Path.GetDirectoryName()”,Location属性似乎已经提供了完整路径。@MikeK Location包含文件名,但只需要目录(请参阅此问题的标题);-)不幸的是,在编写本文时,Docker容器似乎无法在此属性中获得正确的值。在使用web主机时(可能在使用通用主机时),我们应该能够使用类似于
new WebHostBuilder().UseContentRoot(Directory.GetCurrentDirectory())
的东西来修复它。但是,对于使用Docker容器的Azure函数,这是不可用的。对于Azure函数,我们可以求助于以下缺点:
Path.Combine(Path.GetDirectoryName(新Uri)(this.GetType().Assembly.GetName().CodeBase.LocalPath),“.”
。与
“.”“
的组合是从应用程序创建的额外嵌套bin文件夹中向上导航一个目录。显然,函数需要不同的代码并不理想。
Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath)