我说我让用户指定一个指向包含一些数据的文件的路径名 . 然后我可以做 Data* pData=Open(PathName)
. 现在,如果用户再次指定相同的路径名,我希望能够拥有一个已打开文件的表,只返回指向相同数据的指针: Data* pData2=GetOpenedData(PathName)
. 使用简单的 std::map<std::string,Data*>
很容易实现,问题是 PathName
的不同值可以指向同一个文件 . 最简单的情况是Windows上的情况不敏感发挥作用 .
代码是跨平台C,如果需要,我很高兴't have access to .NET stuff (but I'在Windows和UNIX之间存在差异 . 有没有人知道Windows API或POSIX函数可以采用路径名并返回一个我可以关键的唯一(到系统)字符串 . 密钥在两个系统(Windows / POSIX)中不必相同,在我的代码的运行实例中是唯一的 .
现在,我并不担心链接或两种方法来获取相同的文件 . 比如在Windows中,如果我将\ myserver \ share映射到S:那么\ myserver \ share \ blah和S:\ blah是同一个文件,但我可以忍受那些被认为是不同的文件 . 但S:\ blah和S:\ Blah应该是一样的 . 如果有一种方法可以使\ myserver \ share和S:\也是唯一的,这是一个奖励,我会非常高兴,但我可以没有它 . (同样,如果在UNIX中有多个指向同一文件的链接) .
编辑添加:
它并不像在Windows中进行不区分大小写的搜索那么简单 . 例如: c://data/mydata.dat
虽然这是一个"invalid"文件名,windows会接受它,它会实际指向 c:\data\mydata.dat
编辑添加另一件事:
我也希望 c:\mydirectory\..\blah.dat
被认可 c:\blah.dat
3 回答
对于Windows,PathCanonicalize()是您的朋友 . Windows中的shell路径处理包有一些额外的例程可以帮助你 .
不幸的是,我不确定这个包的Unix等价物是什么 .
对于Windows,您可以存储全部小写(或大写)的资源的完整路径 .
我不知道这件事 . 但我相信* nix系统案例确实很重要(
\home\a
和\home\A
不同) . 如果是这种情况,那么您可以省略转换用户输入* nix的情况 .您可以选择使用第三个模板参数实例化
std::map
,这是比较函数/仿函数(参见例如http://www.cplusplus.com/reference/stl/map/) . 您可以提供不区分大小写的字符串比较函数 .我相信Scott Meyers在Effective STL中提供了这样一个功能的一个很好的例子 . 我回家后可以查看这个 .