web-dev-qa-db-ja.com

.NETコンソールアプリケーションでアプリケーションのパスを取得する方法を教えてください。

コンソールアプリケーションでアプリケーションのパスを確認する方法

Windowsフォーム では、Application.StartupPathを使って現在のパスを見つけることができますが、これはコンソールアプリケーションでは利用できないようです。

870
JSmyth

System.Reflection.Assembly.GetExecutingAssembly()Location1

ディレクトリだけが必要な場合は、 System.IO.Path.GetDirectoryName と組み合わせてください。

1 Mr.Mindorのコメントのとおり:
System.Reflection.Assembly.GetExecutingAssembly().Locationは、実行中のアセンブリが現在置かれている場所を返します。シャドウコピーアセンブリの場合は、一時ディレクトリにパスを取得します。 System.Reflection.Assembly.GetExecutingAssembly().CodeBase はアセンブリの「恒久的な」パスを返します。

1097
Sam Axe

現在のアプリケーションディレクトリを取得するには、次のコードを使用できます。

AppDomain.CurrentDomain.BaseDirectory
383
Sarathy

アプリケーションのディレクトリを見つけるための2つのオプションがありますが、選択する目的は目的によって異なります。

// 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);
152
Mr.Mindor

おそらく少し遅いですが、これは言及する価値があります。

Environment.GetCommandLineArgs()[0];

もっと正確に言えば、ディレクトリパスだけを取得するのです。

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

編集:

GetCommandLineArgsがプログラム名を返すことが保証されていないことを指摘した人はかなりいます。 を参照してください。コマンドラインの最初のWordは、規約によってのみプログラム名になります 。この記事には、「ごく少数のWindowsプログラムがこの風変わりな方法を使用していますが、私は自分自身を認識していません」と述べています。それでGetCommandLineArgsを「なりすまし」することは可能ですが、コンソールアプリケーションについて話しています。コンソールアプリは通常素早くて汚いです。だからこれは私のKISS哲学に適合します。

76
Steve Mc

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"から実行されているため、最初の解決策はWebアプリには適していません。

43
rocketsarefast

上記の答えは私が必要としているものの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;
36
fizzled

あなたはこれをやろうとしているかもしれません:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
27
PSU_Kardi

代わりにこれを使うことができます。

System.Environment.CurrentDirectory
23
ButtShock

コンソールアプリケーションの場合は、これを試すことができます。

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¥

20
F.Alves

私はこのコードを使用して解決策を得ました。

AppDomain.CurrentDomain.BaseDirectory

.NET Core互換の方法を探しているのなら、

System.AppContext.BaseDirectory

これは、.NET Framework 4.6および.NET Core 1.0(および.NET Standard 1.3)で導入されました。 AppContext.BaseDirectoryプロパティ を参照してください。

このページ によると

これは.NET CoreのAppDomain.CurrentDomain.BaseDirectoryの推奨置換です。

12
Dejan

プロジェクト参照にSystem.Windows.Formsを追加してから、通常どおりSystem.Windows.Forms.Application.StartupPathを使用することができます。

そのため、より複雑な方法やリフレクションを使用する必要はありません。

8
fruggiero

利用した

System.AppDomain.CurrentDomain.BaseDirectory

アプリケーションフォルダへの相対パスを見つけたいとき。これは、ASP.Netとwinformの両方のアプリケーションで機能します。 System.Webアセンブリへの参照も必要ありません。

8
user2346593

Exeファイルがそれをダブルクリックして呼び出されることになっている場合、私はこれを使用します

var thisPath = System.IO.Directory.GetCurrentDirectory();
8
developer747

つまり、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");
7
user3596865

vB.netで

My.Application.Info.DirectoryPath

私のために動作します(アプリケーションタイプ:クラスライブラリ)。 C#についてよくわからない...ファイル名なしのパスを文字列として返す

5
dba

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);
5
Herman
AppDomain.CurrentDomain.BaseDirectory

インストールパッケージでサードパーティの参照ファイルを参照するように問題を解決します。

5
Nirav Mehta

次の行はあなたにアプリケーションパスを与えるでしょう:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

上記の解決策は、以下の状況で適切に機能しています。

  • シンプルなアプリ
  • assembly.GetEntryAssembly()がnullを返す別のドメイン内
  • DLLはバイト配列としてEmbeddedリソースからロードされ、Assembly.Load(byteArrayOfEmbeddedDll)としてAppDomainにロードされます。
5
user2126375

次の簡単なコードを試してください。

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);
2
daniele3004

これらのメソッドのどれも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) + @"\";
    }
}
2
colin lamarre

別の解決策は、現在のパスを指す相対パスを使用することです。

Path.GetFullPath(".")
1
blenderfreaky

次のコードを使用すると、アプリケーションのフルパスが表示されます。

 class Program
{
    static void Main(string[] args)
    {
        string AppPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        WriteLine($"ApplicationPath ---{AppPath}");
        //OutPut// //ApplicationPath---C:\Users\TestUser\source\repos\ThreadStack\ThreadStack\bin\Debug\ThreadStack.exe
        ReadLine();
    }
}  
0

実行可能パスを取得する方法は多数ありますが、必要に応じて使用する方法は、さまざまな方法について説明したリンクです。

アプリケーション実行可能パスを取得するさまざまな方法

0
Nasir Mahmood

.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"形式のパスが返されます。

0
mark gamache