我如何在 windows 上根据 C++ 中的修改时间读取目录中的文件
how do i read files in a directory according to their modification time in c++ on windows
目前我正在使用dirent.h来迭代访问目录及其子目录中的文件。它根据文件名(按字母顺序)访问它们。出于某种原因,我想根据修改时间访问子目录和文件(最后访问最新修改的文件)。可以这样做吗?
我想首先遍历目录并根据文件的修改时间创建一个排序的文件列表,然后使用此列表相应地读取它们。但我希望有更好的方法。
根据我的初步想法和评论中的建议。
#include<dirent.h>
typedef struct files {
long long mtime;
string file_path;
bool operator<(const files &rhs)const {
return mtime < rhs.mtime;
}
}files;
using namespace std;
vector<struct files> files_list;
void build_files_list(const char *path) {
struct dirent *entry;
DIR *dp;
if (dp = opendir(path)) {
struct _stat64 buf;
while ((entry = readdir(dp))){
std::string p(path);
p += "\";
p += entry->d_name;
if (!_stat64(p.c_str(), &buf)){
if (S_ISREG(buf.st_mode)){
files new_file;
new_file.mtime = buf.st_mtime;
new_file.file_path = entry->d_name;
files.push_back(new_file);
}
if (S_ISDIR(buf.st_mode) &&
// the following is to ensure we do not dive into directories "." and ".."
strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){
//do nothing
}
}
}
closedir(dp);
}
else{
printf_s("\n\tERROR in openning dir %s\n\n\tPlease enter a correct
directory", path);
}
}
void main(){
char *dir_path="dir_path";
build_files_list(dir_path);
sort(files_list.begin(), files_list.end());
//the rest of things to do
}
目前我正在使用dirent.h来迭代访问目录及其子目录中的文件。它根据文件名(按字母顺序)访问它们。出于某种原因,我想根据修改时间访问子目录和文件(最后访问最新修改的文件)。可以这样做吗?
我想首先遍历目录并根据文件的修改时间创建一个排序的文件列表,然后使用此列表相应地读取它们。但我希望有更好的方法。
根据我的初步想法和评论中的建议。
#include<dirent.h>
typedef struct files {
long long mtime;
string file_path;
bool operator<(const files &rhs)const {
return mtime < rhs.mtime;
}
}files;
using namespace std;
vector<struct files> files_list;
void build_files_list(const char *path) {
struct dirent *entry;
DIR *dp;
if (dp = opendir(path)) {
struct _stat64 buf;
while ((entry = readdir(dp))){
std::string p(path);
p += "\";
p += entry->d_name;
if (!_stat64(p.c_str(), &buf)){
if (S_ISREG(buf.st_mode)){
files new_file;
new_file.mtime = buf.st_mtime;
new_file.file_path = entry->d_name;
files.push_back(new_file);
}
if (S_ISDIR(buf.st_mode) &&
// the following is to ensure we do not dive into directories "." and ".."
strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){
//do nothing
}
}
}
closedir(dp);
}
else{
printf_s("\n\tERROR in openning dir %s\n\n\tPlease enter a correct
directory", path);
}
}
void main(){
char *dir_path="dir_path";
build_files_list(dir_path);
sort(files_list.begin(), files_list.end());
//the rest of things to do
}