c# 如何获取文件路径

7次阅读

path类纯字符串操作,轻量安全;fileinfo在文件存在时更高效;winforms/wpf选文件路径格式不同;程序目录应优先用appcontext.basedirectory。

c# 如何获取文件路径

System.IO.Path 解析路径字符串

不需要打开文件,只是从一个字符串中提取目录、文件名或扩展名时,Path 类是最轻量、最安全的选择。它不访问磁盘,纯字符串操作,跨平台兼容性好。

  • Path.GetDirectoryName(@"C:datalog.txt")"C:data"
  • Path.GetFileName(@"C:datalog.txt")"log.txt"
  • Path.GetExtension(@"C:datalog.txt")".txt"
  • Path.GetFullPath("..config.json") → 转为绝对路径(基于当前工作目录)

注意:Path.GetFullPath 会尝试解析相对路径,但不会验证路径是否存在;若当前目录已改变(比如被其他线程或外部程序修改),结果可能出人意料。

FileInfo 获取文件元数据和路径信息

当你已经知道文件存在,且需要同时获取路径、大小、创建时间等信息时,FileInfo 比反复调用 Path 方法更高效——它内部只做一次系统调用。

var file = new FileInfo(@"C:	emp eport.pdf"); Console.WriteLine(file.FullName);     // 完整路径(含驱动器) Console.WriteLine(file.Name);         // 文件名 + 扩展名 Console.WriteLine(file.DirectoryName); // 父目录路径 Console.WriteLine(file.Length);       // 字节大小

关键点:FileInfo 构造函数不校验文件是否存在,只有在你访问 LengthExists 等属性时才触发 IO。如果路径非法(如包含 ?),构造时就会抛 ArgumentException

用户选择文件后怎么拿到路径:WinForms 和 WPF 差异

桌面应用中“让用户选文件”是常见场景,但 WinForms 和 WPF 的控件返回的路径格式不同,容易忽略:

  • WinForms OpenFileDialogFileName 属性返回的是完整路径字符串,如 "C:docsfile.txt"
  • WPF microsoft.Win32.OpenFileDialogFileName 同样返回完整路径,但它的 SafeFileName 只返回文件名(不含路径),且已过滤掉危险字符
  • 两者都**不会自动处理 UNC 路径中的双反斜杠问题**;若用户选了网络路径如 servershare ile.txt,直接使用即可,无需额外转义

别在 ui 层做 Path.GetFullPath —— 用户选的已经是有效绝对路径,再转可能引入冗余 . 或意外改变语义。

获取“当前程序所在目录”不是 Environment.CurrentDirectory

很多人误用 Environment.CurrentDirectory 当作程序根目录,但它其实是进程的工作目录,可被任意代码(包括第三方库)修改,不稳定。

  • 要获取 MyApp.exe 所在文件夹:Path.GetDirectoryName(Assembly.GetExecutingAssembly().location)
  • 要获取项目输出目录(如调试时的 binDebug):AppContext.BaseDirectory
  • 要读取同级配置文件:Path.Combine(AppContext.BaseDirectory, "settings.json")

特别注意:Assembly.GetExecutingAssembly().Location 在 .NET Core / .NET 5+ 中可能返回临时编译路径(如热重载场景),此时 AppContext.BaseDirectory 更可靠。

text=ZqhQzanResources