如果我有一个stringparsing为Windows中的文件path,是否有一种可接受的方式来获得文件名的规范forms?
例如,我想知道是否
C:\stuff\things\etc\misc\whatever.txt
和
C:\stuff\things\etc\misc\other\..\whatever.txt
实际上指向相同的文件,并在我的应用程序中存储path的规范forms。
请注意,简单的string比较将不起作用,也不会有任何正则expression式的魔法。 请记住,自从Windows 2000以及Windows 7中新的Libraries结构之后,我们就有了像NTFS重parsing点这样的事情。
简短的回答:不是真的。
在Windows上没有简单的方法来获取文件的规范名称。 本地文件可以通过SUBST重分析点。 你想处理NTFS路口? Windows快捷键? 那么\\?\
转义文件名
远程文件可以通过映射的驱动器号或通过UNC提供。 这是UNC的原始服务器? 你在使用DFS吗? 服务器是否使用重新分析点等? 服务器是否可以使用多个名称? 那IP地址呢? 它有多个IP地址吗?
所以,如果你正在寻找像Windows上的inode号码那样的东西,那它就不存在了。 例如,见这个页面 。
罗杰是正确的,没有简单的方法。 如果卷支持文件唯一的文件索引,则可以打开文件并调用GetFileInformationByHandle ,但这不适用于所有卷。
Windows API调用GetFullPathName可能是最简单的方法。
使用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:\东西\东西\等\其它\ whatever.txt
C:\东西\东西\等\其它\ whatever.txt
GetFinalPathNameByHandle似乎做你要求的,这是从Windows Vista开始。
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
我会使用System.IO.Path.GetFullPath。 它将一个字符串作为输入(C:\东西\东西\ etc \ misc \其他.. \ whatever.txt在你的情况),并会输出一个字符串(C:\东西\东西\等\ misc \ whatever.txt )。
我想我有点迟了,但是你可以使用System.IO.Path.GetFullPath(“C:\ stuff \ things \ etc \ misc \ other .. \ whatever.txt”),它会返回“C:\东西\东西\等\其它\ whatever.txt”
要获得规范路径,您应该使用PathCanonicalize函数。