如何在.NET中获得绝对或规范化的文件路径?

mar*_*ark 40 .net filepath

如何尽可能少地努力(使用一些已经存在的设施)转换路径c:\aaa\bbb\..\ccc如何c:\aaa\ccc

naw*_*fal 55

我会这样写:

public static string NormalizePath(string path)
{
    return Path.GetFullPath(new Uri(path).LocalPath)
               .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
               .ToUpperInvariant();
}
Run Code Online (Sandbox Code Playgroud)

这应该处理几个场景,如

  1. uri和潜在的逃脱角色,比如

    file:/// C:/Test%20Project.exe - > C:\ TEST PROJECT.EXE

  2. 由点指定的路径段表示当前或父目录

    c:\ aaa\bbb\..\ccc - > C:\ AAA\CCC

  3. 波浪线缩短(长)路径

    C:\ Progra~1\ - > C:\ PROGRAM FILES

  4. 不一致的目录分隔符

    C:/ Documents\abc.txt - > C:\ DOCUMENTS\ABC.TXT

除此之外,它可以忽略大小写,尾随\目录定界符等.

  • 不要将ToUpper()和朋友用于您想要移植的任何代码.世界上存在区分大小写的文件系统.如果您向用户显示这些值也不是很好,在这种情况下,您希望保留大小写并使用不区分大小写的排序和比较.否则,看起来不错. (22认同)
  • @Andy:另一方面,如果使用"NormalizePath"的这种变体将文件复制或移动到某个地方,她/他很可能希望套管不会改变.作为一个用户,我会禁止任何改变我仔细管家命名系统的程序. (5认同)
  • 这正是取决于你的"规范"的意思,但由于Windows将文件路径为不区分大小写的,我会说,你确实是需要的情况下转换,否则有可能为了有一个以上的"规范"的路径相同的文件.我更喜欢小写. (2认同)
  • 因为它确实*重要:*不要更改命名大小写!从用户视觉的角度来看,这是粗鲁的,有时甚至是彻头彻尾的问题。*如果有理由进行“规范比较”,那就是字符串不区分大小写的比较(可能与字典或其他什么)的工作: CI 访问是在 Windows 文件系统 API 中“后“规范”* 处理的! (2认同)

lep*_*pie 44

Path.GetFullPath 也许?

  • @Henk:Path utils实际上不应该检查有效文件,甚至不应该触摸文件系统(但有一些情况它会这样做). (10认同)
  • 我不相信这可以保证返回一个规范名称.它只保证返回的名称可以用来绝对地相对地引用文件 (4认同)
  • Path.GetFullPath(@"c:\ aaa\bbb\..\ccc")= c:\ aaa\ccc - 对我来说足够好了. (3认同)

bdu*_*kes 21

规范化是.NET中Uri类的主要职责之一.

var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
Run Code Online (Sandbox Code Playgroud)

  • 请注意,仍然没有规范化驱动器字母大小写(例如"C:\"和"c:\"两者都没有改变).无论如何,从独特的意义上说,这并不是真正的"规范". (7认同)
  • 不,`Uri`类只负责生成路径.不考虑与这些路径相关的系统.一旦你通过我的答案中的方法获得路径,你仍然需要通过`File`类(或其他)检查它是否存在. (5认同)
  • @AlastairMaw由于Windows FS是CI,假设路径是'canonocial',那么任何其他路径都不同,只有大小写IS规范和等效*甚至*套管差异.消费者也应该使用CI字符串比较作为相关,因为所有情况不同的形式*是相同的. (3认同)