如何获取一个文件夹中按修改日期时间排序的文件列表?

28

我需要列出一个文件夹中的文件列表,并按照它们的修改日期时间排序。

我正在Linux下使用C++,支持Boost库。

请问有人能提供一些样例代码来实现这个功能吗?


2
这与您的其他问题有何不同:https://dev59.com/PG855IYBdhLWcg3wilCD?Nabulke已经为您提供了一个答案,应该会指引您朝着正确的方向前进。从那里开始,将文件添加到向量中并对其进行排序并不太难。 - Ralf
1个回答

55

大多数操作系统不会以特定的顺序返回目录条目。如果你想对它们进行排序(如果你要将结果显示给人类用户,那么你应该这样做),你需要在单独的过程中完成。一种方法是将条目插入到 std::multimap 中,类似于以下代码:

namespace fs = boost::filesystem;
fs::path someDir("/path/to/somewhere");
fs::directory_iterator end_iter;

typedef std::multimap<std::time_t, fs::path> result_set_t;
result_set_t result_set;

if ( fs::exists(someDir) && fs::is_directory(someDir))
{
  for( fs::directory_iterator dir_iter(someDir) ; dir_iter != end_iter ; ++dir_iter)
  {
    if (fs::is_regular_file(dir_iter->status()) )
    {
      result_set.insert(result_set_t::value_type(fs::last_write_time(dir_iter->path()), *dir_iter));
    }
  }
}
你可以通过迭代result_set来获取映射的boost::filesystem::path条目,这些条目将按照升序排列。

1
这里需要注意的是,如果文件在同一秒内被创建/修改,则它们的顺序不能保证,因为 std::time_t 只精确到秒。 - fduff
2
请注意 http://www.boost.org/doc/libs/1_46_1/libs/filesystem/v3/doc/reference.html#last_write_time。 last_write_time获取路径而不是状态。 fs :: last_write_time(dir_iter->path()) - e271p314
1
我可以按照最后写入时间的方式对路径的向量进行排序吗? - sop
3
使用auto和make_iterator_range的C++11版本:https://dev59.com/t2Ei5IYBdhLWcg3w0PCQ#20925615 - user472308
C++17引入了std::filesystem::last_write_time。您可能不需要使用boost来编译提供的示例。 - kindrobot

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