规范化虚拟文件系统的路径表达式
问题描述:
假设您有例如ZipArchive
。使用这个类,可以处理未连接到真实文件系统的文件系统。规范化虚拟文件系统的路径表达式
说出归档具有以下结构:
.
├── Foo
│ └── File1
└── Bar
└── File2
现在,人们可以阅读File1
。如果File1
包含对File2
的相对引用,则它写为../Bar/File2
。
的问题是一个如何可以与该路径../Bar/File2
结合的File1
(Foo/
)的目录,使得结果是Bar/File2
(该ZipArchive
不能处理相对与绝对路径的组合)。
与(dir
和rel
)试图解决方案:
-
Path.Combine
(dir,rel)
仅会将两者之间的/
,因此项不能得到解决; -
new
DirectoryInfo
(Path.Combine(dir,rel)).FullName
生成包含当前目录(cd
)的零件;和 -
Path.GetFullPath
(Path.Combine(dir,rel)).FullName
做同样的
怎么能这样正常化相对路径?人们当然可以自己编写一个标准化程序,但其可能性很高,算法将缺少规范的某些部分。
答
找到了解决办法:只需在第一个路径的前面添加/
,这样Path.GetFullPath
就认为第一个文件来自根目录。
string fullpath = Path.GetFullPath ((Path.Combine ("/",dir,rel))).Substring (1);
还需要执行.Substring
以消除该过程中稍后的斜线。然而,这不是一个可持续的解决方案,因为它使得使用文件系统的假设成为可能,并且斜线的消除也是不安全的。