我正在解决一个问题,我需要一种方法将用户输入的文件名转换为唯一的路径名。假设我让用户指定一个指向包含某些数据的文件的路径名。然后我可以做Data* pData=Open(PathName)
。现在,如果用户再次指定相同的路径名,我希望能够拥有一个已打开文件的表,并只返回指向相同数据的指针:Data* pData2=GetOpenedData(PathName)
。使用简单的std::map<std::string,Data*>
很容易实现,问题是PathName
的不同值可以指向同一个文件。最简单的情况是Windows上的情况不敏感发挥作用。
代码是跨平台的C ++,我无法访问.NET的东西(但我很高兴#ifdef
如果需要,可以c://data/mydata.dat
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
虽然这是一个“无效”的文件名,但Windows会接受它,它会实际指向c:\mydirectory\..\blah.dat
编辑添加另一件事:
我也希望c:\blah.dat
与{{1}}
答案 0 :(得分:0)
对于Windows,您可以存储全部小写(或大写)的资源的完整路径。
我不使用* nix所以不能说明这一点。但我相信* nix系统案例确实很重要(\home\a
和\home\A
不同)。如果是这种情况,那么您可以省略转换* nix的用户输入案例。
答案 1 :(得分:0)
您可以选择使用第三个模板参数来实例化std::map
,这是比较函数/仿函数(参见例如http://www.cplusplus.com/reference/stl/map/)。您可以提供不区分大小写的字符串比较函数。
我相信Scott Meyers在有效STL中提供了这样一个功能的一个很好的例子;我回家后可以查看。
答案 2 :(得分:0)
对于Windows,PathCanonicalize()是您的朋友。 Windows中的shell路径处理包有一些额外的例程可以帮助你。
不幸的是,我不确定这个软件包的Unix等价物是什么。