30#ifndef _MBXMLUTILS_LAST_WRITE_TIME_H_
31#define _MBXMLUTILS_LAST_WRITE_TIME_H_
37#include <boost/date_time/posix_time/posix_time.hpp>
41#ifndef WIN32_LEAN_AND_MEAN
42#define WIN32_LEAN_AND_MEAN
47namespace boost::myfilesystem {
49 inline boost::posix_time::ptime last_write_time(
const std::string &p);
50 inline void last_write_time(
const std::string &p,
const boost::posix_time::ptime &time);
52 boost::posix_time::ptime last_write_time(
const std::string &p) {
55 if(stat(p.c_str(), &st)!=0)
56 throw std::runtime_error(
"system stat call failed: "+p);
57 boost::posix_time::ptime time;
58 time=boost::posix_time::from_time_t(st.st_mtime);
59 time+=boost::posix_time::microsec(st.st_mtim.tv_nsec/1000);
62 HANDLE f=CreateFile(p.c_str(), GENERIC_READ, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
63 if(f==INVALID_HANDLE_VALUE)
64 throw std::runtime_error(
"CreateFile failed: "+p);
65 FILETIME create, lastAccess, lastWrite;
66 if(GetFileTime(f, &create, &lastAccess, &lastWrite)==0) {
68 throw std::runtime_error(
"GetFileTime failed: "+p);
71 uint64_t microSecSince1601=((((uint64_t)(lastWrite.dwHighDateTime))<<32)+lastWrite.dwLowDateTime)/10;
72 uint64_t hoursSince1601=microSecSince1601/1000000/60/60;
73 return boost::posix_time::ptime(boost::gregorian::date(1601,boost::gregorian::Jan,1),
74 boost::posix_time::hours(hoursSince1601)+
75 boost::posix_time::microseconds(microSecSince1601-hoursSince1601*60*60*1000000));
78 void last_write_time(
const std::string &p,
const boost::posix_time::ptime &time) {
80 struct timeval times[2];
81 boost::posix_time::time_period sinceEpoch(boost::posix_time::ptime(boost::gregorian::date(1970, boost::gregorian::Jan, 1)), time);
82 times[0].tv_sec =sinceEpoch.length().total_seconds();
83 times[0].tv_usec=sinceEpoch.length().total_microseconds()-1000000*times[0].tv_sec;
84 times[1].tv_sec =times[0].tv_sec;
85 times[1].tv_usec=times[0].tv_usec;
86 if(utimes(p.c_str(), times)!=0)
87 throw std::runtime_error(
"system utimes call failed: "+p);
89 HANDLE f=CreateFile(p.c_str(), FILE_WRITE_ATTRIBUTES, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
90 if(f==INVALID_HANDLE_VALUE)
91 throw std::runtime_error(
"CreateFile failed: "+p);
92 boost::posix_time::time_period since1601(boost::posix_time::ptime(boost::gregorian::date(1601, boost::gregorian::Jan, 1)), time);
93 boost::posix_time::time_duration dt=since1601.length();
94 uint64_t winTime=((uint64_t)(dt.hours()))*60*60*10000000;
95 dt-=boost::posix_time::hours(dt.hours());
96 winTime+=dt.total_microseconds()*10;
98 changeTime.dwHighDateTime=(winTime>>32);
99 changeTime.dwLowDateTime=(winTime & ((((uint64_t)1)<<32)-1));
100 if(SetFileTime(f, NULL, &changeTime, &changeTime)==0) {
102 throw std::runtime_error(
"SetFileTime failed: "+p);