鉴于:
filesystem::path toDir("./");
ptime oldTime;
ptime now(second_clock::local_time());
如何确定在oldTime
和之间的时间段内创建了哪些文件now
?
此类“新鲜”文件的名称应流式传输到cout
.
更新: 根据给定的答案,我做了一个小程序:
#include <sstream>
#include <stdio.h>
#include <time.h>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
#include <boost/timer.hpp>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
using namespace boost::filesystem;
using namespace boost::posix_time;
using namespace boost::local_time;
using namespace boost::gregorian;
using namespace std;
path file_service_default_path;
boost::timer timerFame;
int64_t desiredTimeFame;
int64_t spendedTimeFame;
ptime oldTime;
ptime nowTime;
bool first_time;
string file_service_get_dif_path(path base_path, path new_path)
{
path sdiffpath;
path stmppath = new_path;
while(stmppath != base_path) {
sdiffpath = path(stmppath.stem().string() + stmppath.extension().string())/ sdiffpath;
stmppath = stmppath.parent_path();
}
string diff_path =sdiffpath.string();// boost::lexical_cast<string>(sdiffpath);
diff_path = diff_path.substr(0, (diff_path.length()));
std::replace(diff_path.begin(), diff_path.end(), '\\', '/');
return diff_path;
}
void is_file(path p)
{
std::string a = file_service_get_dif_path(file_service_default_path, p);
std::cout << "File: " << a << std::endl;
}
void is_new_file(path p)
{
std::time_t t = boost::filesystem::last_write_time( p );
ptime lastAccessTime = from_time_t( t );
if ( lastAccessTime >= oldTime && lastAccessTime <= nowTime )
{
std::string a = file_service_get_dif_path(file_service_default_path, p);
std::cout << "File: " << a << " is new to us." << std::endl;
}
}
void is_dir(path dir)
{
boost::filesystem::directory_iterator dirIter( dir ), dirIterEnd;
while ( dirIter != dirIterEnd )
{
if ( boost::filesystem::exists( *dirIter ) && !boost::filesystem::is_directory( *dirIter ) )
{
if (first_time)
{
is_file((*dirIter));
}
else
{
is_new_file((*dirIter));
}
}
else
{
is_dir((*dirIter));
}
++dirIter;
}
}
void files_walker()
{
while(true)
{
timerFame.restart();
oldTime = nowTime;
nowTime = second_clock::local_time() ;
file_service_default_path = file_service_default_path;
is_dir(file_service_default_path);
first_time = false;
spendedTimeFame = (int64_t)timerFame.elapsed();
cout << spendedTimeFame << std::endl;
if (spendedTimeFame < desiredTimeFame)
boost::this_thread::sleep(boost::posix_time::milliseconds(desiredTimeFame - spendedTimeFame));
}
}
int main()
{
desiredTimeFame = (int64_t)(5000.0f);
first_time = true;
file_service_default_path = "./new";
boost::thread workerThread(files_walker);
cin.get();
}
但它似乎没有显示任何新文件=(如何修复它?
更新 2:
解决了nowTime = second_clock::universal_time();
更新 3: 固定代码:
#include <sstream>
#include <stdio.h>
#include <time.h>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
#include <boost/timer.hpp>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/posix_time/posix_time_io.hpp>
using namespace boost::filesystem;
using namespace boost::posix_time;
using namespace boost::local_time;
using namespace boost::gregorian;
using namespace std;
path file_service_default_path;
boost::timer timerFame;
int64_t desiredTimeFame;
int64_t spendedTimeFame;
ptime oldTime;
ptime nowTime;
bool first_time;
string file_service_get_dif_path(path base_path, path new_path)
{
path sdiffpath;
path stmppath = new_path;
while(stmppath != base_path) {
sdiffpath = path(stmppath.stem().string() + stmppath.extension().string())/ sdiffpath;
stmppath = stmppath.parent_path();
}
string diff_path =sdiffpath.string();// boost::lexical_cast<string>(sdiffpath);
diff_path = diff_path.substr(0, (diff_path.length()));
std::replace(diff_path.begin(), diff_path.end(), '\\', '/');
return diff_path;
}
void is_file(path p)
{
std::string a = file_service_get_dif_path(file_service_default_path, p);
std::cout << "File: " << a << std::endl;
}
void is_new_file(path p)
{
std::time_t t = boost::filesystem::last_write_time( p );
ptime lastAccessTime = from_time_t( t );
if ( lastAccessTime >= oldTime && lastAccessTime <= nowTime )
{
std::string a = file_service_get_dif_path(file_service_default_path, p);
std::cout << "File: " << a << " is new to us." << std::endl;
}
}
void is_dir(path dir)
{
if(!exists(dir))
{
return;
}
boost::filesystem::directory_iterator dirIter( dir );
boost::filesystem::directory_iterator dirIterEnd;
while ( dirIter != dirIterEnd )
{
if ( boost::filesystem::exists( *dirIter ) && !boost::filesystem::is_directory( *dirIter ) )
{
if (first_time)
{
is_file((*dirIter));
}
else
{
is_new_file((*dirIter));
}
}
else
{
is_dir((*dirIter));
}
++dirIter;
}
}
void files_walker()
{
while(true)
{
timerFame.restart();
oldTime = nowTime;
nowTime = second_clock::universal_time();
is_dir(file_service_default_path);
first_time = false;
spendedTimeFame = (int64_t)timerFame.elapsed();
cout << spendedTimeFame << std::endl;
if (spendedTimeFame < desiredTimeFame)
boost::this_thread::sleep(boost::posix_time::milliseconds(desiredTimeFame - spendedTimeFame));
}
}
int main()
{
desiredTimeFame = (int64_t)(5000.0f);
first_time = true;
file_service_default_path = "./new";
boost::thread workerThread(files_walker);
cin.get();
}