C#常見的文件路徑Api


我們經常有遇到要處理文件路徑的需求,那么一般我們常見的有幾種:

  • 程序下面的文件
  • 臨時目錄下的文件

獲取程序下面的文件

首先我們創建了實例解決方案:

其中調用鏈是:Main.Shell->FooALibrary->,首先我們將FooAFolder.txt和FooA.txt的文件屬性設置生成操作為內容,復制到輸出目錄為始終復制

那么我們有什么方法獲取這兩個文件的路徑,我們可能會用到以下方法:

var currentDomainBaseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var result = File.Exists(Path.Combine(currentDomainBaseDirectory, @"FooAFolder\FooAFolder.txt"))? "存在FooAFolder.txt": "不存在FooAFolder.txt";
Console.WriteLine(result);
result = File.Exists(Path.Combine(currentDomainBaseDirectory, @"FooA.txt"))? "存在FooA.txt": "不存在FooA.txt";
Console.WriteLine(result);
//存在FooAFolder.txt
//存在FooA.txt


var currentDirectory = System.Environment.CurrentDirectory;
result=File.Exists(Path.Combine(currentDirectory, @"FooAFolder\FooAFolder.txt")) ? "存在FooAFolder.txt" : "不存在FooAFolder.txt";
Console.WriteLine(result);
result = File.Exists(Path.Combine(currentDirectory, @"FooA.txt")) ? "存在FooA.txt" : "不存在FooA.txt";
Console.WriteLine(result);
//存在FooAFolder.txt
//存在FooA.txt

主要用到的兩種方式就是:

  • 獲取應用程序域的基目錄:AppDomain.CurrentDomain.BaseDirectory

  • 獲取當前工作目錄的完全限定路徑:System.Environment.CurrentDirectory

但是實際上以上兩種方式不是最准和最穩的,

  • System.Environment.CurrentDirectory:為當前工作路徑,假設你用命令行方式打開應用程序,例如,c:/Ryzen ,那么當前工作路徑則不是你安裝到的那個路徑,而是命令行的路徑c:/Ryzen
  • AppDomain.CurrentDomain.BaseDirectory:為獲取應用程序域的基目錄,假如你有一個插件是在AppData臨時目錄下,那么你的插件只能獲取到你安裝應用程序的路徑,而不是你插件的路徑

還有一種最穩的方式:

獲取當前執行程序集的方式:Assembly.GetExecutingAssembly().Location(推薦方式)

var mainExecuteDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
result = File.Exists(Path.Combine(mainExecuteDirectory, @"FooAFolder\FooAFolder.txt")) ? "存在FooAFolder.txt" : "不存在FooAFolder.txt";
Console.WriteLine(result);
result = File.Exists(Path.Combine(mainExecuteDirectory, @"FooA.txt")) ? "存在FooA.txt" : "不存在FooA.txt";
Console.WriteLine(result);
//存在FooAFolder.txt
//存在FooA.txt

//通過反射獲取程序集
var fooAssembly = Assembly.GetAssembly(typeof(FooA));
var fooAExecuteDirectory = Path.GetDirectoryName(fooAssembly.Location);
result = File.Exists(Path.Combine(fooAExecuteDirectory, @"FooAFolder\FooAFolder.txt")) ? "存在FooAFolder.txt" : "不存在FooAFolder.txt";
Console.WriteLine(result);
result = File.Exists(Path.Combine(fooAExecuteDirectory, @"FooA.txt")) ? "存在FooA.txt" : "不存在FooA.txt";
Console.WriteLine(result);
Console.ReadLine();
//存在FooAFolder.txt
//存在FooA.txt

我們還能再拓展一下,我們在FooA FooB添加如下代碼:

public static class FooB
{
    public static void GetExecutingAssemblyPath()
    {
        Console.WriteLine(Assembly.GetExecutingAssembly().Location);
    }

    public static void GetCallingAssemblyPath()
    {
        Console.WriteLine(Assembly.GetCallingAssembly().Location);
    }

    public static void GetEntryAssemblyPath()
    {
        Console.WriteLine(Assembly.GetEntryAssembly().Location);
    }

 }


public  static class FooA
{
    public static void ExecuteFooBGetCallingAssemblyPath()
    {
        FooB.GetCallingAssemblyPath();
    }

    public static void ExecuteFooBGetExecutingAssemblyPath()
    {
        FooB.GetExecutingAssemblyPath();
    }
}

//調用
Console.WriteLine($"{nameof(FooA.ExecuteFooBGetExecutingAssemblyPath)}:");
FooA.ExecuteFooBGetExecutingAssemblyPath();

Console.WriteLine($"{nameof(FooA.ExecuteFooBGetCallingAssemblyPath)}:");
FooA.ExecuteFooBGetCallingAssemblyPath();

Console.WriteLine($"{nameof(FooB.GetExecutingAssemblyPath)}:");
FooB.GetExecutingAssemblyPath();

Console.WriteLine($"{nameof(FooB.GetCallingAssemblyPath)}:");
FooB.GetCallingAssemblyPath();

Console.WriteLine($"{nameof(FooB.GetEntryAssemblyPath)}:");
FooB.GetEntryAssemblyPath();

輸出:

ExecuteFooBGetExecutingAssemblyPath:
C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\FooBLibrary.dll

ExecuteFooBGetCallingAssemblyPath:
C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\FooALibrary.dll

GetExecutingAssemblyPath:
C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\FooBLibrary.dll

GetCallingAssemblyPath:
C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\Main.Shell.dll

GetEntryAssemblyPath:
C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\Main.Shell.dl

我們從上面可以知道以下兩種的用法:

  • 獲取入口程序集路徑:Assembly.GetEntryAssembly().LocationFooALibraryFooBLibrary的入口都是Main.Shell
  • 獲取調用該程序集的程序集路徑:Assembly.GetCallingAssembly().Location,當 Main.Shell調FooBLibrary,輸出Main.ShellFooALibrary調FooBLibrary,輸出FooALibrary

因此,用程序集Assembly的一些路徑Api是非常靈活且准確的

獲取臨時目錄下的文件

我們也經常會遇到需要獲取臨時目錄路徑的方式來放置一些程序臨時文件,可以用下面方式獲取:

Console.WriteLine(Path.GetTempPath());
//C:\Users\Ryzen\AppData\Local\Temp\


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM