首页 文章

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

提问于
浏览
1

我说我让用户指定一个指向包含一些数据的文件的路径名 . 然后我可以做 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 回答

  • 0

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

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

  • 0

    对于Windows,您可以存储全部小写(或大写)的资源的完整路径 .

    我不知道这件事 . 但我相信* nix系统案例确实很重要( \home\a\home\A 不同) . 如果是这种情况,那么您可以省略转换用户输入* nix的情况 .

  • 0

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

    我相信Scott Meyers在Effective STL中提供了这样一个功能的一个很好的例子 . 我回家后可以查看这个 .

相关问题