我有一个程序可以输入一个文件列表,这些文件保存在std::vector
中:
std::vector<std::string> fileNames;
用户可以完全自由地输入任何文件名(它们来自argv
),如果输入引用同一文件的文件名,程序应该忽略重复项。
问题是用户甚至可以使矢量具有如下内容:
{
"myfile1.txt",
"/path/to/myfile1.txt",
"/path//to/myfile1.txt"
}
考虑到我从/path/to
调用程序,这三个文件名引用相同的文件,但它们是不同的字符串。
我必须使用fopen()
(不与std::ifstream
)打开它们。
在开始进程之前检查所有程序fopen()
的所有文件,所以这不是问题。
是否有一种有效的方法来删除重复的文件名?
答案 0 :(得分:2)
您可以使用std::set
而不是向量来确保相同的字符串仅列出一次。
或者,您可以std::sort
(或std::stable_sort
)向量,然后使用std::unique
与std::erase
结合删除重复项。
对于引用同一文件的非相同字符串;在Linux上,您可以使用realpath(3)
规范化所有路径,然后再将它们添加到向量(或集合)中。我不知道Windows上的等效功能,但我确定有一个功能。如果您还需要在Windows上使用它,可以尝试在msdn.com上搜索。
答案 1 :(得分:0)
对于便携式解决方案,您可以使用boost::filesystem
:
返回:如果sf1 == sf2且p1和p2解析为同一文件,则返回true 系统实体,否则为假。
这样您就必须将每个文件相互比较,或者您可以使用boost::canonical()或boost::weekly_canonical()来规范化路径并使用std::sort
,因为它不会更有效必须比较每一对。