C#常见的文件路径Api

其中调用链是:Main.Shell->FooALibrary->,首先我们将FooAFolder.txt和FooA.txt的文件属性设置生成操作为内容,复制到输出目录为始终复制

那么我们有什么方法获取这两个文件的路径,我们可能会用到以下方法:

Copy
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(推荐方式)

Copy
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添加如下代码:

Copy
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();

输出:

Copy
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().Location,FooALibrary和FooBLibrary的入口都是Main.Shell
获取调用该程序集的程序集路径:Assembly.GetCallingAssembly().Location,当 Main.Shell调FooBLibrary,输出Main.Shell,FooALibrary调FooBLibrary,输出FooALibrary
因此,用程序集Assembly的一些路径Api是非常灵活且准确的

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

Copy
Console.WriteLine(Path.GetTempPath());
//C:\Users\Ryzen\AppData\Local\Temp
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值