c++oding="utf-8" ?>
std::filesystem::last_write_time返回file_time_type,需转system_clock::time_point再计算时差;c++20用to_sys(),c++17需平台适配;删旧文件应判>7*24h、捕获异常、过滤非普通文件并加写权限。

用 std::filesystem::last_write_time 获取文件修改时间
Windows 和 Linux 下都能用,但返回值类型是 std::filesystem::file_time_type,不是秒数或 time_t,直接减会编译失败。必须先转成统一的时间基准(比如系统时钟),否则算不出天数差。
- 别用
auto t = fs::last_write_time(p)后直接减——类型不匹配,报错类似no operator- matches these operands - 正确做法是转成
std::chrono::system_clock::time_point:用fs::file_time_type::clock::to_sys(t)(C++20 起支持) - 老标准(C++17)没
to_sys,得靠平台适配:Windows 用FileTimeToSystemTime,Linux 用stat.st_mtim,不推荐手撸
计算「多久以前」要用 std::chrono::duration_cast 而非整数除法
时间点相减得到的是 duration,但默认单位是纳秒级,直接除 86400 得不到“天数”——可能因截断丢精度,尤其跨夏令时或闰秒区域更不准。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
duration_cast<:hours>(tp_now - tp_file).count()</:hours>比用秒再除安全 - 删 7 天前的文件,建议判
> 7 * 24h,而不是> 7d(std::chrono::days在某些 libstdc++ 版本里有 bug) - 注意时区:
system_clock::now()是本地时区,last_write_time在 NTFS 上存的是 UTC,但to_sys已自动处理,不用手动调时区
遍历目录时跳过子目录、只删普通文件
fs::recursive_directory_iterator 默认进子目录,一不留神就把整个子树删了;而 fs::is_regular_file 不检查是否可写,遇到只读文件会抛 permission_denied 异常。
- 用
fs::directory_iterator(非 recursive)避免误入子目录 - 加
if (fs::is_regular_file(it->status()))过滤掉 .lnk、.dll、目录本身 - 删之前先
fs::permissions(p, fs::perms::owner_write, fs::perm_options::add),防只读文件失败 - 异常要捕获:
fs::remove失败不终止循环,否则一个文件出错,后面全跳过
完整删旧文件的最小可靠片段(C++20)
下面这段能跑通、不崩、不误删,覆盖常见坑:
namespace fs = std::filesystem;
namespace ch = std::chrono;
<p>auto now = ch::system_clock::now();
ch::hours cutoff = 7 * 24h;</p><p>for (const auto& it : fs::directory_iterator("/path/to/dir")) {
try {
if (!fs::is_regular_file(it->status())) continue;
auto ft = fs::last_write_time(it->path());
auto tp = fs::file_time_type::clock::to_sys(ft);
if (now - tp > cutoff) {
fs::permissions(it->path(), fs::perms::owner_write, fs::perm_options::add);
fs::remove(it->path());
}
} catch (const fs::filesystem_error&) { /<em> 忽略权限/忙文件 </em>/ }
}</p>
真正麻烦的不是逻辑,是 Windows 上 last_write_time 可能被索引服务篡改、Linux 上 ext4 的 time_granularity 导致同秒内多个文件时间一样——这些没法靠代码绕过,得接受“删得不够精确”这个事实。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










