- 主题:相同的代码在不同的vs版本下运行结果不同
比如下面的代码,删除nDays之前的老日志,在vs2019和2022运行都没问题,但是在vs2015下,即使是nDays以内的文件,fileTime < nDaysAgo也成立,运行结果就是所有的日志都清除了
#if defined(_MSC_VER)
#if _MSC_VER == 1900
namespace fs = std::experimental::filesystem;
#elif _MSC_VER >= 1910
namespace fs = std::filesystem;
#endif
#endif
void LoggerUtil::cleanFiles(const fs::path& p, const unsigned int nDays)
{
if (!fs::exists(p) || !fs::is_directory(p))
return;
std::lock_guard<std::mutex> lock(gMtxClean);
// Get the current file time
fs::file_time_type currentTime = fs::file_time_type::clock::now();
// Calculate the file time n days ago
fs::file_time_type nDaysAgo = currentTime - std::chrono::hours(24) * nDays;
// Recursively iterate over files in the folder
//for (const auto& f : fs::recursive_directory_iterator(p)) {
for (const auto& f : fs::directory_iterator(p)) {
if (fs::is_regular_file(f)) {
// Get the last write time of the file
fs::file_time_type fileTime = fs::last_write_time(f);
// Check if the file is older than n days
if (nDays > 0 && fileTime < nDaysAgo)
dirfile_util::RemoveFile(f.path());
}
}
}
请教,什么原因造成的这种结果,是代码有问题吗?还是说filesystem在vs2015本身就是experimental不稳定的?
--
修改:miui FROM 114.252.238.*
FROM 114.252.238.*
【 在 miui 的大作中提到: 】
: 比如下面的代码,删除nDays之前的老日志,在vs2019和2022运行都没问题,但是在vs2015下,即使是nDays以内的文件,fileTime < nDaysAgo也成立,运行结果就是所有的日志都清除了
: #if defined(_MSC_VER)
: #if _MSC_VER == 1900
: ...................
为啥用试验库?
看看VS2015有没有SP补丁包, 就别说试验库了, 就是正常库出bug也不稀奇。
微软也不是神。
--
FROM 124.126.0.*
1 看一下时间
ftime = std::filesystem::last_write_time(p);
std::cout << std::format("File write time is {}\n", ftime);
2 新代码为什么要用vs2015编译?微软承诺 vs2015后二进制兼容,以前的库不要动,可以直接链接。新代码新工具,旧代码旧工具。叙叙升级。
【 在 miui 的大作中提到: 】
: 比如下面的代码,删除nDays之前的老日志,在vs2019和2022运行都没问题,但是在vs2015下,即使是nDays以内的文件,fileTime < nDaysAgo也成立,运行结果就是所有的日志都清除了
: #if defined(_MSC_VER)
: #if _MSC_VER == 1900
: ...................
--
FROM 36.40.140.*
想在不同的编译环境用统一的代码
【 在 poggy 的大作中提到: 】
:
: 为啥用试验库?
: 看看VS2015有没有SP补丁包, 就别说试验库了, 就是正常库出bug也不稀奇。
: ...................
--
FROM 123.116.149.*
【 在 miui 的大作中提到: 】
: 想在不同的编译环境用统一的代码
那把可相关的最新库代码单摘出来, 放自己工程里面就行了。
加个namespace, 就可以避免和系统库冲突。
一般独立性比较好的,也就几个文件。
--
FROM 124.126.0.*
码农对自己好点,不要用vs2015那么老的东西了吧
vs2019/vs2022估计是MS投入最大的dev工具了,定期发布新版本,勤快得很。
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
把
fs::file_time_type nDaysAgo = currentTime - std::chrono::hours(24) * nDays;
改成
fs::file_time_type nDaysAgo = currentTime - std::chrono::hours(24 * nDays);
就好了
【 在 miui 的大作中提到: 】
: 比如下面的代码,删除nDays之前的老日志,在vs2019和2022运行都没问题,但是在vs2015下,即使是nDays以内的文件,fileTime < nDaysAgo也成立,运行结果就是所有的日志都清除了
: #if defined(_MSC_VER)
: #if _MSC_VER == 1900
: ...................
--
FROM 123.116.149.*
可以用boost fs,然后换个namespace也就和std差不多
【 在 miui 的大作中提到: 】
: 想在不同的编译环境用统一的代码
: 【 在 poggy 的大作中提到: 】
: :
: ...................
--
FROM 123.119.25.*
估计是运行时库 有些微区别
c++最烦编译器实现不同了
【 在 miui 的大作中提到: 】
: 比如下面的代码,删除nDays之前的老日志,在vs2019和2022运行都没问题,但是在vs2015下,即使是nDays以内的文件,fileTime < nDaysAgo也成立,运行结果就是所有的日志都清除了
: #if defined(_MSC_VER)
: #if _MSC_VER == 1900
: ...................
--
FROM 223.104.41.*
希望楼主补一下debug过程,duration乘以标量应该是很早支持的操作,如果是不支持转成了标量,再乘标量就奇怪了。
【 在 miui 的大作中提到: 】
:
: 把
: fs::file_time_type nDaysAgo = currentTime - std::chrono::hours(24) * nDays;
: 改成
: fs::file_time_type nDaysAgo = currentTime - std::chrono::hours(24 * nDays);
#发自zSMTH-v-@OnePlus IN2010
--
FROM 223.104.41.*