关于c#:获取应用程序文件夹路径的最佳方式

Best way to get application folder path

我看到有一些方法可以获取应用程序文件夹路径:

  • Application.StartupPath
  • System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().Location)
  • AppDomain.CurrentDomain.BaseDirectory
  • System.IO.Directory.GetCurrentDirectory()
  • Environment.CurrentDirectory
  • System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  • System.IO.Path.GetDirectory(Application.ExecutablePath)
  • 根据情况,最好的方法是什么?


    对于访问位置与应用程序安装目录相关的文件,AppDomain.CurrentDomain.BaseDirectory可能是最有用的。

    在ASP.NET应用程序中,这将是应用程序根目录,而不是bin子文件夹——这可能是您通常想要的。在客户机应用程序中,它将是包含主可执行文件的目录。

    在vsto 2005应用程序中,它是包含应用程序的vsto托管程序集的目录,而不是指向Excel可执行文件的路径。

    其他目录可能会根据您的环境返回不同的目录-例如,请参见@vimvq1987的答案。

    CodeBase是找到文件的地方,可以是以http://开头的URL。在这种情况下,Location可能是程序集下载缓存。不能保证为GAC中的程序集设置基本代码。


  • Application.StartupPath和7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)只适用于Windows窗体应用程序

  • System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().Location)

    会给你一些类似的东西:"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101",这是你运行的页面所在的位置。

  • 用于Web应用程序的AppDomain.CurrentDomain.BaseDirectory可能很有用,它将返回类似于"C:\\hg\\Services\\Services\\Services.Website\\"的内容,这是基本目录,非常有用。

  • System.IO.Directory.GetCurrentDirectory()和5.Environment.CurrentDirectory

  • 将为从Visual Studio(如EDOCX1)(13))以调试模式运行的Web应用程序获取进程从-so激发的位置。

  • System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  • 会得到运行代码的.dll的位置,对于可能是"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"的web应用程序。

    例如,控制台应用程序点2-6将是.exe文件所在的目录。

    希望这能节省你一些时间。


    注意,并非所有这些方法都会返回相同的值。在某些情况下,它们可以返回相同的值,但要小心,它们的用途不同:

    1
    Application.StartupPath

    返回StartupPath参数(可在运行应用程序时设置)

    1
    System.IO.Directory.GetCurrentDirectory()

    返回当前目录,该目录可能是应用程序所在的文件夹,也可能不是。同样适用于Environment.CurrentDirectory。如果在一个dll文件中使用它,它将返回进程运行的路径(在ASP.NET中尤其如此)。


    对于Web应用程序,要获取当前Web应用程序根目录,通常按网页调用当前传入请求:

    1
    2
    3
    HttpContext.Current.Server.MapPath();

    System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

    以上代码说明


    我成功地使用了这个

    1
    System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

    它甚至在LinqPad内部也能工作。


    我在会话中从实际登录的用户(在任务管理器会话1中不是0)通过win32 api从Windows服务启动了一个进程。在这个过程中,我们可以知道,哪个变量是最好的。

    对于上述问题中的所有7个案例,结果如下:

    1
    2
    3
    4
    5
    6
    7
    Path1: C:\Program Files (x86)\MyProgram
    Path2: C:\Program Files (x86)\MyProgram
    Path3: C:\Program Files (x86)\MyProgram\
    Path4: C:\Windows\system32
    Path5: C:\Windows\system32
    Path6: file:\C:\Program Files (x86)\MyProgram
    Path7: C:\Program Files (x86)\MyProgram

    也许这对你们中的一些人有帮助,做同样的事情,当你为你的案例搜索最好的变量时。


    如果知道获取根目录:

    1
    string rootPath = Path.GetPathRoot(Application.StartupPath)

    根据我的经验,最好的方法是把这些结合起来。

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase会给你垃圾箱文件夹
  • Directory.GetCurrentDirectory()在.NET核心而不是.NET上运行良好,并将为您提供项目的根目录
  • System.AppContext.BaseDirectoryAppDomain.CurrentDomain.BaseDirectory。在.NET中工作正常,但在.NET核心中不工作,它将为您提供项目的根目录
  • 在一个应该以.NET和.NET核心为目标的类库中,我检查哪个框架是该库的宿主,并选择其中一个框架。


    这一个"system.io.path.getdirectory(application.executablepath)"更改为System.IO.Path.GetDirectoryName(application.executablePath)


    根目录:

    1
    2
    DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
    var driverPath = cDrive.RootDirectory;