2010-10-14 56 views
1

我正在处理一个问题,我需要将用户输入的文件名转换为唯一的路径名。比方说,我让用户指定一个指向包含一些数据的文件的路径名称。然后我可以做Data* pData=Open(PathName)。现在,如果用户再次指定相同的路径名称,我希望能够拥有一个已打开文件的表格,并只返回指向相同数据的指针:Data* pData2=GetOpenedData(PathName)。这很容易通过简单的std::map<std::string,Data*>完成,问题是PathName的不同值可以指向同一个文件。最简单的情况是Windows不区分大小写。找到给定输入的唯一路径名称

该代码是跨平台的C++,我没有访问.NET的东西(但我很乐意#ifdef Windows和UNIX之间的差异,如果需要)。有谁知道Windows API或POSIX函数可以采用路径名并返回一个唯一的(系统)字符串,我可以将其键入。两个系统(Windows/POSIX)中的密钥不一定是相同的,只是在我的代码的运行实例中是唯一的。

现在,我不担心链接或两种方式来到同一个文件。比如在Windows中,如果我将\ myserver \ share映射到S:那么\ myserver \ share \ blah和S:\ blah是同一个文件,但我可以和那些被认为不同的文件一起生活。但是S:\ blah和S:\ Blah应该是一样的。如果有办法让\ myserver \ share和S:\也是唯一的,那是一种奖励,我会很开心,但我可以没有它。 (同样,如果在UNIX中有多个指向同一文件的链接)。

编辑补充:

这不是那么简单,只是做在窗户不区分大小写的搜索。例如:c://data/mydata.dat,而这是“无效的”文件名时,Windows会接受它,它会actualy点c:\data\mydata.dat

编辑补充另一件事:

我还想c:\mydirectory\..\blah.dat同时为被认可c:\blah.dat

回答

0

对于Windows,PathCanonicalize()是你的朋友。 Windows中的shell路径处理包有一些额外的例程可以帮助你。

不幸的是,我不确定这个包的Unix等价物是什么。

0

对于Windows,您可以存储使所有小写(或大写)资源的完整路径。

我不使用* nix所以不能告诉。但我相信在* nix系统的情况下很重要(\home\a\home\A是不同的)。如果是这种情况,那么你可以省略转换大小写* nix的用户输入。

0

您可以选择使用第三个模板参数实例化std::map,该参数是比较函数/函数(请参阅,例如http://www.cplusplus.com/reference/stl/map/)。您可以提供不区分大小写的字符串比较函数。

我相信Scott Meyers在Effective STL中提供了这样一个函数的一个很好的例子;我回家后可以检查一下。

相关问题