C ++ - 拆分文件名和文件扩展名

时间:2010-11-30 13:52:09

标签: c++ windows string split

好的,首先我不想使用Boost或任何外部库。我只想使用 C ++标准库。我可以使用split()函数轻松地使用给定分隔符拆分字符串:

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) {
    std::string ea;
    std::stringstream stream(string);
    while(getline(stream, ea, delim))
        tokens.push_back(ea);
}

我在文件名上执行此操作。但是有一个问题。有些文件具有以下扩展名:tar.gztar.bz2等。此外,还有一些文件名有额外的点。 Some.file.name.tar.gz。我想分开Some.file.nametar.gz 注意:文件名中的点数不是常数。

我也试过PathFindExtension但没有运气。这可能吗?如果是的话,请赐教。谢谢。

编辑:我很抱歉没有指定操作系统。这是Windows。

5 个答案:

答案 0 :(得分:6)

我认为您可以使用std::string find_last_of来获取最后.的索引,并使用substr来剪切字符串(尽管涉及多个的“复杂扩展”)点需要额外的工作)。

答案 1 :(得分:5)

没有办法做你想要的,不涉及扩展数据库的目的。扩展没有什么神奇之处,它们只是文件名的一部分(如果你gunzip foo.tar.gz你可能会得到一个foo.tar,所以对于这个应用程序.gz实际上是“扩展名”)。因此,为了做你想做的事,建立一个你想要寻找的扩展数据库,如果你找不到,就会回到“最后一个点”。

答案 2 :(得分:2)

C ++标准库中没有任何内容 - 也就是说,它不在标准库中 - 但我所知道的每个操作系统都以各种方式提供此功能。

在Windows中,您可以使用_splitpath(),在Linux中,您可以使用dirname()&amp;基名()

答案 3 :(得分:0)

问题确实是*.tar.gz这样的文件名,由于({至少在Windows中).tar部分不属于扩展名,因此无法一致地拆分。您要么必须保留这些特殊情况的列表,要么使用单点string::rfind来查找其他情况,或者找到一些预先实现的方法。请注意,.tar.*扩展名不是无限的,而且非常标准化(我认为其中大约有10个)。

答案 4 :(得分:0)

您可以创建一个您认为可能会遇到的文件扩展名查找表。如果遇到任何新问题,还可以添加命令行选项以将新的选项添加到查找表中。然后解析文件名以查看查找表中的任何条目是否是文件名中的子字符串。

编辑:您也可以参考这个问题:C++/STL string: How to mimic regex like function with wildcards?