【发布时间】:2022-10-24 09:53:05
【问题描述】:
我需要按日期对文件列表进行排序。有this answer 怎么做。不过这让我很担心:它运行在一个可以在运行期间更改的实时文件系统上。
比较函数使用:
struct FileNameModificationDateComparator{
//Returns true if and only if lhs < rhs
bool operator() (const std::string& lhs, const std::string& rhs){
struct stat attribLhs;
struct stat attribRhs; //File attribute structs
stat( lhs.c_str(), &attribLhs);
stat( rhs.c_str(), &attribRhs); //Get file stats
return attribLhs.st_mtime < attribRhs.st_mtime; //Compare last modification dates
}
};
据我了解,此函数可以并且将针对同一个文件多次调用,并将其与不同的文件进行比较。该文件可以在 sort 运行时被外部进程修改;一个较旧的文件可以在两次比较之间变成最新的,并且比一个相当旧的文件更旧,然后比一个最新的文件更新......
std::sort() 会做什么?我对结果中的一些稀少的订购错误很好。我对崩溃或冻结(无限循环)或其他此类不愉快感到不满意。我安全吗?
【问题讨论】:
-
垃圾进垃圾出。您要么需要锁定系统,以便在此期间无法添加新文件,要么拍摄文件系统的快照并对其进行排序。您无法在数据集发生变异时对其进行排序。
-
如果在排序过程中修改了基础数据(如文件),您将拥有未定义的行为将您需要的所有文件信息一次读入一个容器,然后引用这个固定的非修改容器进行排序。
-
我已经看到它与一个糟糕的比较器崩溃了。
-
即使忽略 UB,为了速度,我宁愿只
stat文件一次。 -
问题标题看起来像是在尝试对石头、论文和剪刀进行分类 :)