C++具有相同名称开头的多个文件

3

有没有一种方法可以在不指定完整名称和数量的情况下打开具有相同名称开头的文件?它们应该逐个打开,而不是一次性全部打开。 例如,我有文件: certainstr_123.txt,certainstr_5329764.txt,certainstr_1323852.txt。

或者,也许可以更容易地在其他语言中完成? 谢谢。


注意:这个术语叫做globbing(或“shell globs”)。此外,你不仅想要“常见名称开头”(顺便说一下,这被称为前缀)。毕竟,还有常见的后缀。 - sehe
2个回答

2
C++没有定义一种标准的方法来以那种方式列出文件。
最好的跨平台方法是使用库,例如boost filesystem模块。我不认为boost::filesystem有通配符搜索,您必须自己过滤文件,但这并不难。
您可以使用正则表达式,就像其他答案中所述(这是完美的解决方案)。可能只需要检查文件扩展名(i->path().extension())和以"certainstr_"开头的文件名(boost::starts_withstd::string::substr)即可。
如果选择使用C++11标准的regex库,请确保拥有最新的libstdc++
有很多特定于系统的函数。例如,请参见:

有一些Unix / Windows示例。

您还可以尝试类似以下内容(Windows):

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

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

解析`list.txt`输出文件(当然这是个技巧)。
无论如何,根据您的需求,基于Python(或脚本)的解决方案可能更简单(也可以参见如何列出目录中的所有文件?)。
[glob.glob('certainstr_*.txt')][3]

或者也可以说:
files = [f for f in os.listdir('.') if re.match(r'certainstr_\d+.txt', f)]

这是Python版本的https://dev59.com/VYTba4cB1Zd3GeqP8qC0#26585425

这里有很多“相关引用”,但实际上没有回答问题(simple_ls示例不过滤模式,链接的答案明显是特定于平台的,那些hack...太疯狂了)。提到Python是...好吧,我猜OP就是要求这个:/ - sehe
@sehe 感谢您的观察。我已经添加了一些代码并更改了一个链接。 - manlio
等一下,这里发生了什么?你添加了我5小时前发布的代码示例,然后...我被踩了。你知道的,我很高兴你修改了你的答案。我给你点赞。 - sehe
@sehe 再次道歉:我并没有给你的回答点踩,读了你的回答后我确信你使用的是C++11正则表达式而不是boost。是时候休息一下了 ;) - manlio

1

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

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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接