2021-05-16

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.txtvar 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

但是实际上以上两种方式不是最准和最稳的,还有一种最稳的方式:

获取当前执行程序集的方式: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.dllExecuteFooBGetCallingAssemblyPath:C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\FooALibrary.dllGetExecutingAssemblyPath:C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\FooBLibrary.dllGetCallingAssemblyPath:C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\Main.Shell.dllGetEntryAssemblyPath:C:\Users\Ryzen\source\repos\CommonFilePathApiSample\Main.Shell\bin\Debug\netcoreapp3.1\Main.Shell.dl

我们从上面可以知道以下两种的用法:

  • 获取入口程序集路径:Assembly.GetEntryAssembly().LocationFooALibraryFooBLibrary的入口都是Main.Shell
  • 获取调用该程序集的程序集路径:Assembly.GetCallingAssembly().Location,当 Main.ShellFooBLibrary,输出Main.ShellFooALibraryFooBLibrary,输出FooALibrary

因此,用程序集Assembly的一些路径Api是非常灵活且准确的

获取临时目录下的文件

我们也经常会遇到需要获取临时目录路径的方式来放置一些程序临时文件,可以用下面方式获取:

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








原文转载:http://www.shaoqun.com/a/747777.html

跨境电商:https://www.ikjzd.com/

coles:https://www.ikjzd.com/w/2506

慧聪集团:https://www.ikjzd.com/w/1836


我们经常有遇到要处理文件路径的需求,那么一般我们常见的有几种:程序下面的文件临时目录下的文件获取程序下面的文件首先我们创建了实例解决方案:其中调用链是:Main.Shell->FooALibrary->,首先我们将FooAFolder.txt和FooA.txt的文件属性设置生成操作为内容,复制到输出目录为始终复制那么我们有什么方法获取这两个文件的路径,我们可能会用到以下方法:varcu
jpgoodbuy:https://www.ikjzd.com/w/1553
达方物流:https://www.ikjzd.com/w/2562
乐一番:https://www.ikjzd.com/w/1562
嗯啊,,医生,,好爽,,啊 那一刻我再也忍不住:http://lady.shaoqun.com/m/a/274741.html
乖把腿张开塞胡萝卜 少妇口述与小叔子的疯狂乱史:http://www.30bags.com/a/254533.html
认准"五大战略品类"把握B2B跨境电商蓝海商机:https://www.ikjzd.com/home/132468

No comments:

Post a Comment