通过修改时间获取目录中的文件

3
我想编写一个C++函数,用于将目录中所有文件的文件名填充到一个向量中。此外,我希望这个向量按照文件的最后修改时间排序。
我可以使用boost::filesystem读取目录中的所有文件并将其传递给一个向量,但是这些文件是通过文件名加载到向量中的,然后我必须对文件进行stat并执行排序,这不太有效率。
有人知道快速完成此操作的方法吗?例如,ls -lhctr几乎可以立即完成,因此C ++应该也能够快速处理大型目录。
如果可能,我还希望具有亚毫秒级分辨率。

你提到了 boost::filesystem -- 使用 last_write_time 有什么问题吗? - ildjarn
1
即使您需要在之后执行排序,我怀疑除了最庞大的目录外,这不会花费太长时间。我的第一个建议是尝试使用Boost,并确保它对您的目的来说不够快,然后再尝试更复杂的东西。您可能会发现这个解决方案已经足够好了。 - KRyan
我没有进行任何分析,我是通过在函数调用前后进行简单测试来得出这些数字的。 - user788171
@user788171 你确定是排序部分占用了时间,而不是文件系统调用遍历目录?我很难相信对包含700个元素的向量进行排序需要2秒钟。另外,你是否开启了优化编译选项? - Praetorian
@user788171 过早的优化是万恶之源。 - ForEveR
显示剩余3条评论
4个回答

2
也许是 map/multimap<std::time_t/dt::ptime, std::string/fs::path>

你能详细说明一下这是如何工作的吗?此外,这个时间分辨率是多少?如果有两个文件在一毫秒内创建,它能区分它们吗? - user788171
@user788171 使用示例。mb multimap 将更好。 http://liveworkspace.org/code/e1728a60450e2b06d6c11fa0445a0e56 - ForEveR

2
您可以使用 Boost.Filesystem 迭代目录,并在每个文件上调用 last_write_time()
然后,使用 last_write_time 调用的结果作为键,将文件名存储在 std::multimap 中。这样,在将其插入容器时自动完成排序。

我对std::multimap并不是很熟悉,你能给一个简短的代码示例以及更多关于为什么它更高效的细节吗?这样我就可以尝试理解了。谢谢提前。 - user788171
@user788171 我发布的链接中有一个很好的multimap描述。基本上,它与std::map相同,只是每个键可以有多个与之关联的值。因此,如果目录中包含具有相同修改时间的多个文件,则可以将它们全部存储在容器中。使用multimap的好处是它是一个排序的容器,当您插入一个值时,它会根据键值(在您的情况下是修改时间)和插入前的比较谓词进行排序。 - Praetorian
时间的时间分辨率是多少?它能区分创建时间相差1微秒的两个文件吗?那1毫秒呢? - user788171
@user788171 分辨率取决于您平台上的std::time_t类型和文件系统实现的质量。 - Praetorian

0

0

我并不想掀起关于C++ system()函数的争论,但您提到“ls -lhctr”几乎立即返回答案,那为什么不使用system()函数呢?试试:

system("ls -lhctr > out.txt");

然后使用fstream头文件的getline()函数读取数据?

当然,使用system()函数保证了这种解决方案不会在其他操作系统上可移植,但也许您并不关心这一点。


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