2010-11-30 182 views
4

好吧,首先我不想使用Boost或任何外部库。我只想使用C++标准库。我可以很容易地分裂与给定的分隔符串与我split()功能:C++ - 分割文件名和文件扩展名

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.gz,tar.bz2等。还有一些文件名有额外的点。 Some.file.name.tar.gz。我希望分开Some.file.nametar.gz注意:文件名中的点数不是恒定的。我也试过PathFindExtension但没有运气。这可能吗?如果是这样,请赐教。谢谢。

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

+1

你想只使用C++标准库,让你尝试操作系统特定的功能`PathFindExtension` ... – 2010-11-30 14:10:21

回答

6

我想你可以使用std::stringfind_last_of得到最后.的指标,并substr削减字符串(虽然涉及多个点的“复杂扩展名”将需要额外的工作)。

+0

完美工作。谢谢。 – Ruel 2010-11-30 14:40:04

+0

遇到类似如下路径的文件时,此方法将失败:** C:\ Some.Folder \ somefile ** – 2013-03-24 15:58:39

+0

“我对文件名执行此操作” – icecrime 2013-03-24 18:55:27

2

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

在Windows中可以使用_splitpath(),而在Linux下,你可以使用目录名()&基名()

+0

很抱歉,但`_splitpath()`没有工作。 – Ruel 2010-11-30 14:26:28

0

问题的确是像*.tar.gz这样的文件名,由于(至少在Windows中).tar部分不是扩展的一部分,所以文件名不能一致分割。您必须为这些特殊情况保留一个列表,并为其余部分使用单点string::rfind或找到一些预先实施的方法。请注意,.tar.*扩展不是无限的,并且非常标准化(我认为其中大约有十个)。

5

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

0

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

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