JSm*_*yth 902 .net c# console console-application
如何在控制台应用程序中找到应用程序的路径?
在Windows窗体中,我可以Application.StartupPath用来查找当前路径,但这似乎在控制台应用程序中不可用.
Sam*_*Axe 1136
System.Reflection.Assembly.GetExecutingAssembly().1Location
再加上System.IO.Path.GetDirectoryName如果你想要的是目录.
1 根据Mr.Mindor的评论:
System.Reflection.Assembly.GetExecutingAssembly().Location返回执行程序集当前所在的位置,这可能是也可能不是程序集在不执行时所在的位置.对于卷影复制程序集,您将获得临时目录中的路径.System.Reflection.Assembly.GetExecutingAssembly().CodeBase将返回程序集的"永久"路径.
小智 393
您可以使用以下代码获取当前的应用程序目录.
AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
Mr.*_*dor 159
您有两种方法可以找到应用程序的目录,您选择的目录取决于您的目的.
// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests,
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);
Run Code Online (Sandbox Code Playgroud)
Ste*_* Mc 78
可能有点晚了,但值得一提:
Environment.GetCommandLineArgs()[0];
Run Code Online (Sandbox Code Playgroud)
或者更正确地获取目录路径:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Run Code Online (Sandbox Code Playgroud)
编辑:
不少人指出,GetCommandLineArgs不保证返回程序名称.请参阅命令行中的第一个单词是仅按惯例的程序名称.文章确实说"虽然极少数Windows程序使用这个怪癖(我自己也不知道)".因此可以"欺骗" GetCommandLineArgs,但我们正在讨论控制台应用程序.控制台应用程序通常很快且很脏.所以这符合我的KISS理念.
roc*_*ast 43
对于任何对asp.net网络应用感兴趣的人.以下是我对3种不同方法的结果
protected void Application_Start(object sender, EventArgs e)
{
string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
string p3 = this.Server.MapPath("");
Console.WriteLine("p1 = " + p1);
Console.WriteLine("p2 = " + p2);
Console.WriteLine("p3 = " + p3);
}
Run Code Online (Sandbox Code Playgroud)
结果
p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging
Run Code Online (Sandbox Code Playgroud)
该应用程序从"C:\ inetpub\SBSPortal_staging"实际运行,因此第一个解决方案绝对不适合Web应用程序.
fiz*_*led 37
上面的答案是我需要的90%,但是为我返回了一个Uri而不是常规路径.
正如MSDN论坛帖子中所解释的,如何将URI路径转换为普通文件路径?,我使用了以下内容:
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
Run Code Online (Sandbox Code Playgroud)
PSU*_*rdi 27
您可能希望这样做:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
Run Code Online (Sandbox Code Playgroud)
小智 22
你可以使用这个.
System.Environment.CurrentDirectory
Run Code Online (Sandbox Code Playgroud)
F.A*_*ves 19
对于控制台应用程序,您可以尝试:
System.IO.Directory.GetCurrentDirectory();
Run Code Online (Sandbox Code Playgroud)
输出(在我的本地机器上):
c:\ users\xxxxxxx\documents\visual studio 2012\Projects\ImageHandler\GetDir\bin\Debug
或者你可以尝试(最后还有一个额外的反斜杠):
AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
输出:
c:\ users\xxxxxxx\documents\visual studio 2012\Projects\ImageHandler\GetDir\bin\Debug \
Dej*_*jan 16
如果您正在寻找兼容.NET Core的方法,请使用
System.AppContext.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
这是在.NET Framework 4.6和.NET Core 1.0(以及.NET Standard 1.3)中引入的.请参阅:AppContext.BaseDirectory属性.
根据这个页面,
这是.NET Core中AppDomain.CurrentDomain.BaseDirectory的首选替代品
Tri*_*ion 14
我已经使用了这段代码并获得了解决方案.
AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
您可以简单地添加到项目引用中System.Windows.Forms,然后System.Windows.Forms.Application.StartupPath 照常使用.
因此,不需要更复杂的方法或使用反射.
如果应该通过双击调用exe来使用它
var thisPath = System.IO.Directory.GetCurrentDirectory();
Run Code Online (Sandbox Code Playgroud)
小智 7
我用过
System.AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
当我想找到一个相对于应用程序文件夹的路径.这适用于ASP.Net和winform应用程序.它也不需要任何对System.Web程序集的引用.
对于.NET 6,有Environment.ProcessPath。
请参阅https://learn.microsoft.com/en-us/dotnet/api/system.environment.processpath?view=net-6.0
我的意思是,为什么不ap/invoke方法?
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
public class AppInfo
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
public static string StartupPath
{
get
{
StringBuilder stringBuilder = new StringBuilder(260);
GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
return Path.GetDirectoryName(stringBuilder.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以像Application.StartupPath一样使用它:
Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
Run Code Online (Sandbox Code Playgroud)
下一行将为您提供一个应用程序路径:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Run Code Online (Sandbox Code Playgroud)
上述解决方案在以下情况下正常工作:
mkbundle捆绑包(其他方法无效)Assembly.GetEntryAssembly().Location 要么 Assembly.GetExecutingAssembly().Location
与组合使用System.IO.Path.GetDirectoryName()仅获取目录。
尽管大多数情况下目录是相同的,但来自GetEntryAssembly()和的路径GetExecutingAssembly()可以不同。
随着GetEntryAssembly()你要知道,这可以返回null,如果输入模块未被管理(即C ++或VB6可执行文件)。在这种情况下,可以使用GetModuleFileNameWin32 API:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
Run Code Online (Sandbox Code Playgroud)
小智 5
AppDomain.CurrentDomain.BaseDirectory
Run Code Online (Sandbox Code Playgroud)
将解决此问题以引用带有安装包的第 3 方参考文件。
在VB.net
My.Application.Info.DirectoryPath
Run Code Online (Sandbox Code Playgroud)
为我工作(应用程序类型:类库)。不确定C#...将不带文件名的路径作为字符串返回
我没有看到任何人将 .Net Core 反射提供的 LocalPath 转换为可用的 System.IO 路径,所以这是我的版本。
public static string GetApplicationRoot()
{
var exePath = new Uri(System.Reflection.
Assembly.GetExecutingAssembly().CodeBase).LocalPath;
return new FileInfo(exePath).DirectoryName;
}
Run Code Online (Sandbox Code Playgroud)
这将返回C:\\xxx\\xxx代码所在位置的完整格式化路径。
使用 .NET Core 3 及更高版本,您将获得 .dll 而不是 .exe 文件。要获取您可以使用的 .exe 文件路径。
var appExePath = Process.GetCurrentProcess().MainModule.FileName;
Run Code Online (Sandbox Code Playgroud)