c# 常见文件路径Api的使用示例

作者:RyzenAdorer 时间:2023-06-03 21:06:12 

目录
  • 获取程序下面的文件

  • 获取临时目录下的文件

获取程序下面的文件

首先我们创建了实例解决方案:

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

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

获取当前执行程序集的方式: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.ShellFooBLibrary,输出Main.ShellFooALibraryFooBLibrary,输出FooALibrary

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

获取临时目录下的文件

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


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

来源:https://www.cnblogs.com/ryzen/p/14771328.html

标签:c#,文件路径,api
0
投稿

猜你喜欢

  • Android Activity生命周期调用的理解

    2023-05-13 14:15:42
  • C# 透明窗体制作实现方法比较分析

    2022-11-26 02:35:30
  • C#多线程之Thread中Thread.Join()函数用法分析

    2022-01-20 14:47:58
  • Android实现将应用崩溃信息发送给开发者并重启应用的方法

    2021-07-25 02:42:14
  • spring mvc中直接注入的HttpServletRequst安全吗

    2021-12-29 07:48:16
  • Androd 勇闯高阶性能优化之布局优化篇

    2023-01-22 12:12:15
  • C#实现类型的比较示例详解

    2022-02-18 18:17:44
  • C#反射(Reflection)详解

    2022-09-16 22:58:11
  • Android 监听手机GPS打开状态实现代码

    2022-09-28 08:56:38
  • java实现摄像头截图功能

    2023-12-01 19:53:22
  • Java Springboot 重要知识点整理汇总

    2022-03-17 01:06:57
  • c#创建圆形类Circle、矩形类实现代码

    2023-08-18 19:59:12
  • Android Studio多工程引用同一个library项目配置的解决方法

    2022-04-07 16:39:40
  • 解析C#拼接Json串的几种方法

    2021-12-28 20:22:48
  • Flutter路由守卫拦截的实现

    2021-11-12 21:24:12
  • 详解java爬虫jsoup解析多空格class数据

    2021-12-30 14:47:41
  • android应用开发之spinner控件的简单使用

    2021-10-29 08:07:22
  • Java编程泛型限定代码分享

    2023-11-09 17:46:32
  • Java swing读取txt文件实现学生考试系统

    2021-06-13 17:41:02
  • 解析C#设计模式之单例模式

    2021-12-15 17:41:12
  • asp之家 软件编程 m.aspxhome.com