代码之家  ›  专栏  ›  技术社区  ›  dthrasher

如何解析Windows中的规范文件名?

  •  9
  • dthrasher  · 技术社区  · 15 年前

    如果我有一个在Windows中解析为文件路径的字符串,是否有一种可接受的方法来获取文件名的规范格式?

    例如,我想知道

    C:\stuff\things\etc\misc\whatever.txt
    

    C:\stuff\things\etc\misc\other\..\whatever.txt
    

    实际上,指向同一个文件或不指向同一个文件,并将路径的规范形式存储在我的应用程序中。

    请注意,简单的字符串比较不起作用,任何regex魔法也不起作用。记住我们有这样的东西 NTFS reparse points 以处理Windows2000和Windows7中的新库结构。

    8 回复  |  直到 8 年前
        1
  •  9
  •   Roger Lipscombe    15 年前

    简短回答:不是真的。

    在Windows上获取文件的规范名称没有简单的方法。本地文件可以通过重分析点和子节点来使用。是否要处理NTFS连接?Windows快捷方式?怎么样 \\?\ -转义文件名

    远程文件可以通过映射的驱动器号或UNC提供。这是源服务器的UNC吗?你在使用DFS吗?服务器是否使用重分析点等?服务器是否可以使用多个名称?IP地址呢?它有多个IP地址吗?

    所以,如果你想在窗户上找到类似inode的号码,它就不在那里了。例如,请参见, this page .

        2
  •  4
  •   Stephen Nutt    15 年前

    罗杰是对的,没有简单的方法。如果卷支持文件唯一的文件索引,则可以打开该文件并调用 GetFileInformationByHandle ,但这不适用于所有卷。

    Windows API调用 GetFullPathName 可能是最好的简单方法。

        3
  •  3
  •   jheddings    15 年前

    使用 FileInfo (C中的示例):

    FileInfo info1 = new FileInfo(@"C:\stuff\things\etc\misc\whatever.txt");
    FileInfo info2 = new FileInfo(@"C:\stuff\things\etc\misc\other\..\whatever.txt");
    if (info1.FullName.Equals(info2.FullName)) {
        Console.WriteLine("yep, they're equal");
    }
    Console.WriteLine(info1.FullName);
    Console.WriteLine(info2.FullName);
    

    输出为:

    是的,他们是平等的
    C:\Stuff\Things\etc\misc\whatever.txt文件
    C:\Stuff\Things\etc\misc\whatever.txt文件

        4
  •  3
  •   user75810    12 年前

    GetFinalPathNameByHandle 从Windows Vista开始,似乎按您的要求执行。

        5
  •  1
  •   John Paulett    15 年前

    jheddings有一个很好的答案,但是由于你没有指出你使用的是哪种语言,我想我会给你一个python的方法来实现它,它也可以在命令行中使用。 os.path.abspath :

    > python -c "import os.path; print os.path.abspath('C:\stuff\things\etc\misc\other\..\whatever.txt')"
    C:\stuff\things\etc\misc\whatever.txt
    
        6
  •  0
  •   JP Gouigoux    12 年前

    我将使用system.io.path.getfullpath。它以一个字符串作为输入(在您的例子中是c:\stuff\things\etc\misc\other..\whatever.txt),并将输出一个字符串(c:\stuff\things\etc\misc\whatever.txt)。

        7
  •  0
  •   Hellon    8 年前

    我想我有点晚了,但是你可以使用system.io.path.getfullpath(“c:\tuff\things\etc\misc\other..\whatever.txt”),它会返回“c:\tuff\things\etc\misc\whatever.txt”

        8
  •  -1
  •   Nex    11 年前

    要获得规范路径,应该使用 PathCanonicalize 功能。