查找给定输入的唯一路径名

时间:2010-10-14 16:36:32

标签: c++ winapi posix

我正在解决一个问题,我需要一种方法将用户输入的文件名转换为唯一的路径名。假设我让用户指定一个指向包含某些数据的文件的路径名。然后我可以做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}}

一样被识别

3 个答案:

答案 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等价物是什么。

相关问题