2014-10-27 59 views
2

有没有什么办法可以打开具有通用名称但没有指定全名和数量的文件?他们应该一个接一个地打开,而不是一次打开。 例如,我有文件: certainstr_123.txt,certainstr_5329764.txt,certainstr_1323852.txt。C++多个文件的通用名称开头

或者,也许它可以更容易地在另一种语言中完成? 谢谢。

+0

注意:这个术语是globbing(或“shell globs”)。此外,你不需要“通用名称开始”(顺便说一下,它被称为_prefix_)。毕竟,还有一些常见的_suffix_。 – sehe 2014-10-27 10:28:33

回答

2

C++没有定义以这种方式列出文件的标准方式。

最好的跨平台方法是使用库,如boost filesystem模块。我不认为boost::filesystem有通配符搜索,你必须自己过滤文件,但这并不困难。

您可以使用正则表达式,就像在其他答案中一样(这是完美的解决方案)。 也许它可能足以检查文件扩展名(i->path().extension())和文件名以“certainstr_”boost::starts_withstd::string::substr)开头。 如果您选择C++ 11标准正则表达式库,请确保最近有一个libstdc++

有很多系统特定的功能。例如。见:

一些UNIX/Windows的例子。

你也可以尝试像(Windows)中:

std::system("dir /b certainstr_*.txt > list.txt"); 

或(UNIX):

std::system("ls -m1 certainstr_*.txt > list.txt"); 

解析list.txt输出文件(当然这是一个黑客)。

无论如何,根据您的需要,基于Python的(或基于脚本的)解决方案可能是简单的(见How to list all files of a directory?):

[glob.glob('certainstr_*.txt')][3] 

,或者也:

files = [f for f in os.listdir('.') if re.match(r'certainstr_\d+.txt', f)] 

这是Python的等价物https://stackoverflow.com/a/26585425/3235496

+0

它有很多“关闭引用”,但实际上没有什么答案('simple_ls'示例不会过滤模式,链接的答案肯定是平台特定的,黑客......狂野的黑客)。提到python是...嗯,我猜OP要求:/ – sehe 2014-10-27 10:27:12

+0

@sehe感谢您的意见。我添加了一些代码并更改了链接。 – manlio 2014-10-27 16:02:12

+0

等一下。这里发生了什么?你添加我5小时前发布的代码示例,然后...我得到一个downvote。你知道,我很高兴你修改了你的答案。从我+1。 – sehe 2014-10-27 16:08:24

0

我建议只使用正则表达式。伪代码:

boost::regex reg("^certainstr_\\d+.txt$"); 
for(recursive_directory_iterator it("."); it != recursive_directory_iterator(); ++it) 
{ 
    if(boost::regex_search(it->string(), reg)) 
    { 
     cout << *it << endl; 
    } 
} 
+0

+1优雅和简单! – manlio 2014-10-27 16:29:03

相关问题