如何在控制台应用程序中找到应用程序的路径?
在Windows Forms中,我可以使用Application.StartupPath
来查找当前路径,但这似乎在控制台应用程序中不可用。
答案 0 :(得分:1097)
System.Reflection.Assembly.GetExecutingAssembly()
。Location
1
如果您想要的只是目录,请将其与System.IO.Path.GetDirectoryName
相结合。
1 根据Mr.Mindor的评论:
System.Reflection.Assembly.GetExecutingAssembly().Location
返回执行程序集当前所在的位置,这可能是也可能不是程序集在不执行时所在的位置。对于卷影复制程序集,您将获得临时目录中的路径。System.Reflection.Assembly.GetExecutingAssembly().CodeBase
将返回程序集的“永久”路径。
答案 1 :(得分:383)
您可以使用以下代码获取当前的应用程序目录。
AppDomain.CurrentDomain.BaseDirectory
答案 2 :(得分:146)
您有两种方法可以找到应用程序的目录,您选择的目录取决于您的目的。
// 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);
答案 3 :(得分:76)
可能有点迟了但值得一提:
Environment.GetCommandLineArgs()[0];
或者更正确地获取目录路径:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
修改强>
相当多的人指出GetCommandLineArgs
无法保证返回程序名称。见The first word on the command line is the program name only by convention。文章确实说“虽然极少数Windows程序使用这个怪癖(我自己也不知道)”。所以有可能'欺骗'GetCommandLineArgs
,但我们正在谈论一个控制台应用程序。控制台应用程序通常很快且很脏。所以这符合我的KISS理念。
答案 4 :(得分: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);
}
结果
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
该应用程序是从“C:\ inetpub \ SBSPortal_staging”实际运行的,因此第一个解决方案绝对不适合网络应用。
答案 5 :(得分:36)
上面的答案是我所需要的90%,但是为我返回了一个Uri而不是常规路径。
正如MSDN论坛帖子How to convert URI path to normal filepath?中所述,我使用了以下内容:
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
答案 6 :(得分:27)
您可能希望这样做:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
答案 7 :(得分:22)
你可以改用这个。
System.Environment.CurrentDirectory
答案 8 :(得分:19)
对于控制台应用程序,您可以尝试:
System.IO.Directory.GetCurrentDirectory();
输出(在我的本地机器上):
c:\ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug
或者你可以尝试(最后还有一个额外的反斜杠):
AppDomain.CurrentDomain.BaseDirectory
输出:
c:\ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug \
答案 9 :(得分:15)
我已使用此代码并获得解决方案。
NullPointerException
答案 10 :(得分:12)
如果您正在寻找与.NET Core兼容的方式,请使用
System.AppContext.BaseDirectory
这是在.NET Framework 4.6和.NET Core 1.0(以及.NET Standard 1.3)中引入的。请参阅:AppContext.BaseDirectory Property。
根据this page,
这是.NET Core中AppDomain.CurrentDomain.BaseDirectory的首选替代品
答案 11 :(得分:8)
我用过
System.AppDomain.CurrentDomain.BaseDirectory
当我想找到相对于应用程序文件夹的路径时。这适用于ASP.Net和winform应用程序。它也不需要任何对System.Web程序集的引用。
答案 12 :(得分:8)
您只需将项目引用System.Windows.Forms
添加到项目中,然后照常使用System.Windows.Forms.Application.StartupPath
。
因此,不需要更复杂的方法或使用反射。
答案 13 :(得分:7)
如果应该通过双击调用exe来使用它
var thisPath = System.IO.Directory.GetCurrentDirectory();
答案 14 :(得分:6)
我的意思是,为什么不用p / 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());
}
}
}
您可以像Application.StartupPath一样使用它:
Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
答案 15 :(得分:5)
在VB.net中
My.Application.Info.DirectoryPath
适合我(应用程序类型:类库)。不确定C#... 返回没有Filename为string
的路径答案 16 :(得分:5)
AppDomain.CurrentDomain.BaseDirectory
将解决问题以引用带有安装包的第三方参考文件。
答案 17 :(得分:5)
Assembly.GetEntryAssembly().Location
或Assembly.GetExecutingAssembly().Location
与System.IO.Path.GetDirectoryName()
结合使用以仅获取目录。
GetEntryAssembly()
和GetExecutingAssembly()
的路径可能不同,即使大多数情况下目录都是相同的。
对于GetEntryAssembly()
,您必须知道如果条目模块不受管理(即C ++或VB6可执行文件),则可以返回null
。在这些情况下,可以使用Win32 API中的GetModuleFileName
:
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
答案 18 :(得分:5)
以下行将为您提供一个应用程序路径:
var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
以上解决方案在以下情况下正常运行:
答案 19 :(得分:3)
使用 .NET Core 3 及更高版本,您将获得 .dll 而不是 .exe 文件。要获取您可以使用的 .exe 文件路径。
var appExePath = Process.GetCurrentProcess().MainModule.FileName;
答案 20 :(得分:2)
这些方法都不适用于使用exe的符号链接等特殊情况,它们将返回链接的位置而不是实际的exe。
因此可以使用QueryFullProcessImageName来解决这个问题:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Diagnostics;
internal static class NativeMethods
{
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr OpenProcess(
UInt32 dwDesiredAccess,
[MarshalAs(UnmanagedType.Bool)]
Boolean bInheritHandle,
Int32 dwProcessId
);
}
public static class utils
{
private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
private const UInt32 PROCESS_VM_READ = 0x010;
public static string getfolder()
{
Int32 pid = Process.GetCurrentProcess().Id;
int capacity = 2000;
StringBuilder sb = new StringBuilder(capacity);
IntPtr proc;
if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
return "";
NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);
string fullPath = sb.ToString(0, capacity);
return Path.GetDirectoryName(fullPath) + @"\";
}
}
答案 21 :(得分:2)
尝试这一简单的代码:
string exePath = Path.GetDirectoryName( Application.ExecutablePath);
答案 22 :(得分:1)
另一种解决方案是使用指向当前路径的相对路径:
Path.GetFullPath(".")
答案 23 :(得分:0)
我没有看到有人将.Net Core反射提供的LocalPath转换为可用的System.IO路径,所以这是我的版本。
public static string GetApplicationRoot()
{
var exePath = new Uri(System.Reflection.
Assembly.GetExecutingAssembly().CodeBase).LocalPath;
return new FileInfo(exePath).DirectoryName;
}
这将返回代码所在位置的完整“C:\ xxx \ xxx”格式化路径。
答案 24 :(得分:0)
有很多方法可以获得可执行路径,我们应该使用哪种方法取决于我们的需求,这是一个讨论不同方法的链接。
答案 25 :(得分:0)
var geojson_for_school_780 = {
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[[175.228088376393515, -37.72252796906151], [175.226034730098121, -37.720644653205419], [175.22766664238091, -37.719790045099124], [175.226669852036935, -37.719494534245776], [175.226063764869849, -37.719139298407981], [175.225684377028415, -37.718639517004007], [175.229416445471969, -37.718249363032648], [175.229085250983672, -37.71615637690455], [175.232916799597604, -37.715781597614502], [175.232994305233518, -37.716138715739554], [175.233444251633273, -37.716777017700473], [175.234158364268694, -37.71640115383375], [175.236281071637421, -37.716492901297777], [175.236778969848842, -37.714982027731864], [175.23678197389944, -37.714972736633278], [175.237007068442892, -37.714289969996393], [175.237241870249363, -37.713577440478581], [175.237270572373717, -37.713490244242642], [175.240150572754345, -37.714065821500597], [175.240643435719903, -37.712513828060004], [175.243666181667777, -37.712865753620441], [175.250868816480903, -37.716764632124416], [175.251583336046906, -37.717696153282141], [175.254009088257504, -37.723034477939613], [175.253880254830392, -37.723454795140654], [175.25349101820072, -37.723784706999517], [175.253036672946649, -37.724303029748867], [175.252594231767404, -37.72400311293994], [175.251708805537902, -37.724234350926004], [175.250761189334611, -37.724405921967168], [175.248617924442527, -37.724701883851303], [175.248670831855691, -37.724983622610388], [175.248108644705894, -37.725216958649114], [175.248650574856413, -37.725715016374757], [175.249211188456741, -37.72611261827015], [175.249655009537463, -37.726795407802669], [175.249611471330013, -37.727653444472836], [175.249251932365951, -37.728735469804036], [175.24882851502224, -37.729535978099591], [175.248699477963925, -37.729951947833527], [175.248679639737873, -37.730696376073432], [175.247396212196207, -37.730617917521215], [175.246153794004499, -37.730656875737637], [175.241864451038253, -37.727794371200304], [175.241180169528519, -37.728000311784783], [175.240588231182812, -37.727848333950995], [175.240153830359304, -37.727715480402672], [175.239851710703874, -37.727454948983301], [175.239875963992915, -37.727229477760901], [175.240149140367777, -37.726915638650944], [175.240215554761789, -37.726697642096219], [175.239903506117116, -37.726453987907334], [175.239653784325327, -37.726127205552878], [175.239401725478814, -37.725855878978372], [175.23926283076392, -37.725450394672841], [175.238884215081299, -37.725544253360944], [175.238640207482177, -37.725662986352773], [175.238359547776611, -37.725743664646863], [175.237811460334513, -37.725663095694664], [175.237255020354979, -37.725649360565903], [175.236522478420255, -37.725705843488996], [175.235863906512094, -37.725769794857271], [175.235254998449847, -37.725764800151751], [175.234768745586678, -37.725649642237613], [175.23447386768197, -37.725613939759789], [175.234072007153287, -37.725513740156622], [175.233809457524046, -37.725177407031069], [175.233740971157573, -37.725003820731189], [175.233592583214886, -37.724956818310353], [175.23343240605891, -37.724868400347226], [175.233446176252102, -37.724643142640126], [175.232926621407813, -37.724158104107403], [175.232567102025371, -37.72386686778475], [175.232324859841981, -37.723743049267213], [175.231984024121715, -37.723568840798833], [175.23168917633987, -37.723418148852147], [175.230339273580199, -37.721887519404923], [175.230117128172367, -37.720706116231113], [175.229491841292969, -37.720595274641148], [175.229321718089551, -37.720651789039294], [175.229205499717182, -37.720954090252832], [175.228911973926813, -37.72096000947694], [175.22877250197385, -37.720862830025283], [175.228781549692457, -37.721145956121312], [175.228565121524923, -37.721266978437441], [175.228351630524628, -37.72147959497768], [175.228462480264795, -37.721993967796962], [175.228088376393515, -37.72252796906151]]]}, "properties": {"Office": "HM", "PolyID": 780, "INSTTYPE": "Contributing", "PolyName": "Te Ao Marama School", "SchoolID": 780, "ApprovalDate": "2017/03/16", "EffectiveDate": "2019/01/01"
}
}
var zone_780 = L.geoJson(geojson_for_school_780,{
attribution: "<a href='https://www.educationcounts.govt.nz/site-info/privacy'>CC-by NZ Ministry of Education</a>"
});
zone_780.addTo(map);
map.fitBounds(zone_780.getBounds());
是我尝试过的每种情况下唯一为我工作的人。
答案 26 :(得分:-1)
这是一个可靠的解决方案,适用于 32位和 64位应用程序。
添加以下参考:
使用System.Diagnostics;
使用System.Management;
将此方法添加到您的项目中:
public static string GetProcessPath(int processId)
{
string MethodResult = "";
try
{
string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
{
using (ManagementObjectCollection moc = mos.Get())
{
string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();
MethodResult = ExecutablePath;
}
}
}
catch //(Exception ex)
{
//ex.HandleException();
}
return MethodResult;
}
现在使用它:
int RootProcessId = Process.GetCurrentProcess().Id;
GetProcessPath(RootProcessId);
请注意,如果您知道进程的id,则此方法将返回相应的ExecutePath。
额外,对于那些感兴趣的人:
Process.GetProcesses()
...将为您提供所有当前正在运行的进程的数组,以及......
Process.GetCurrentProcess()
...将为您提供当前流程及其信息,例如Id等,并且还有限的控制,例如杀等等*
答案 27 :(得分:-5)
您可以使用解决方案资源管理器在项目中创建文件夹名称作为资源,然后您可以在资源中粘贴文件。
private void Form1_Load(object sender, EventArgs e) {
string appName = Environment.CurrentDirectory;
int l = appName.Length;
int h = appName.LastIndexOf("bin");
string ll = appName.Remove(h);
string g = ll + "Resources\\sample.txt";
System.Diagnostics.Process.Start(g);
}