8#ifndef INCLUDED_BDLS_FILESYSTEMUTIL_WINDOWSIMPUTIL
9#define INCLUDED_BDLS_FILESYSTEMUTIL_WINDOWSIMPUTIL
58#include <bdlt_datetime.h>
138template <
class WINDOWS_INTERFACE>
149 typedef typename WINDOWS_INTERFACE::INT64
Offset;
156 typedef typename WINDOWS_INTERFACE::BOOL BOOL;
160 typedef typename WINDOWS_INTERFACE::DWORD DWORD;
164 typedef typename WINDOWS_INTERFACE::FILETIME FILETIME;
168 typedef typename WINDOWS_INTERFACE::HANDLE HANDLE;
172 typedef typename WINDOWS_INTERFACE::INT64 INT64;
176 typedef typename WINDOWS_INTERFACE::LPDWORD LPDWORD;
180 typedef typename WINDOWS_INTERFACE::LPFILETIME LPFILETIME;
184 typedef typename WINDOWS_INTERFACE::LPSYSTEMTIME LPSYSTEMTIME;
188 typedef typename WINDOWS_INTERFACE::SYSTEMTIME SYSTEMTIME;
192 typedef typename WINDOWS_INTERFACE::ULARGE_INTEGER ULARGE_INTEGER;
196 typedef typename WINDOWS_INTERFACE::ULONG64 ULONG64;
200 typedef typename WINDOWS_INTERFACE::ULONGLONG ULONGLONG;
204 typedef typename WINDOWS_INTERFACE::WORD WORD;
213 static BOOL FileTimeToSystemTime(
const FILETIME *lpFileTime,
214 LPSYSTEMTIME lpSystemTime);
220 static DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
227 static BOOL GetFileTime(HANDLE hFile,
228 LPFILETIME lpCreationTime,
229 LPFILETIME lpLastAccessTime,
230 LPFILETIME lpLastWriteTime);
234 static DWORD GetLastError();
241 static BOOL SystemTimeToFileTime(
const SYSTEMTIME *lpSystemTime,
242 LPFILETIME lpFileTime);
259 const LPFILETIME lpFileTime);
283template <
class WINDOWS_INTERFACE>
284typename WINDOWS_INTERFACE::BOOL
286 const FILETIME *lpFileTime,
287 LPSYSTEMTIME lpSystemTime)
289 return WINDOWS_INTERFACE::FileTimeToSystemTime(lpFileTime, lpSystemTime);
292template <
class WINDOWS_INTERFACE>
293typename WINDOWS_INTERFACE::DWORD
294FilesystemUtil_WindowsImpUtil<WINDOWS_INTERFACE>::GetFileSize(
296 LPDWORD lpFileSizeHigh)
298 return WINDOWS_INTERFACE::GetFileSize(hFile, lpFileSizeHigh);
301template <
class WINDOWS_INTERFACE>
302typename WINDOWS_INTERFACE::BOOL
303FilesystemUtil_WindowsImpUtil<WINDOWS_INTERFACE>::GetFileTime(
305 LPFILETIME lpCreationTime,
306 LPFILETIME lpLastAccessTime,
307 LPFILETIME lpLastWriteTime)
309 return WINDOWS_INTERFACE::GetFileTime(
310 hFile, lpCreationTime, lpLastAccessTime, lpLastWriteTime);
313template <
class WINDOWS_INTERFACE>
314typename WINDOWS_INTERFACE::DWORD
315FilesystemUtil_WindowsImpUtil<WINDOWS_INTERFACE>::GetLastError()
317 return WINDOWS_INTERFACE::GetLastError();
320template <
class WINDOWS_INTERFACE>
321typename WINDOWS_INTERFACE::BOOL
322FilesystemUtil_WindowsImpUtil<WINDOWS_INTERFACE>::SystemTimeToFileTime(
323 const SYSTEMTIME *lpSystemTime,
324 LPFILETIME lpFileTime)
326 return WINDOWS_INTERFACE::SystemTimeToFileTime(lpSystemTime, lpFileTime);
330template <
class WINDOWS_INTERFACE>
334 const LPFILETIME lpFileTime)
346 static ULONGLONG adjustedFiletimeEpochToUnixEpochInMicros;
350 const SYSTEMTIME unixEpochSystemTimeUtc =
362 FILETIME unixEpochFileTimeUtc;
363 const BOOL systemTimeToFileTimeStatus = SystemTimeToFileTime(
364 &unixEpochSystemTimeUtc,
365 &unixEpochFileTimeUtc);
366 if (!systemTimeToFileTimeStatus) {
372 ULARGE_INTEGER unixEpochFileTimeInTicks;
373 unixEpochFileTimeInTicks.u.HighPart =
374 unixEpochFileTimeUtc.dwHighDateTime;
375 unixEpochFileTimeInTicks.u.LowPart =
376 unixEpochFileTimeUtc.dwLowDateTime;
378 adjustedFiletimeEpochToUnixEpochInMicros =
379 unixEpochFileTimeInTicks.QuadPart /
380 k_WINDOWS_TICKS_PER_MICROSECOND;
384 ULARGE_INTEGER lastWriteTimeInTicks;
385 lastWriteTimeInTicks.u.HighPart = lpFileTime->dwHighDateTime;
386 lastWriteTimeInTicks.u.LowPart = lpFileTime->dwLowDateTime;
388 ULONGLONG lastWriteTimeInMicroseconds = lastWriteTimeInTicks.QuadPart /
389 k_WINDOWS_TICKS_PER_MICROSECOND;
391 if (lastWriteTimeInMicroseconds <
392 adjustedFiletimeEpochToUnixEpochInMicros) {
400 adjustedFiletimeEpochToUnixEpochInMicros);
410template <
class WINDOWS_INTERFACE>
416 BSLS_ASSERT(0 == bsl::numeric_limits<DWORD>::min());
417 BSLS_ASSERT(0xFFFFFFFFul == bsl::numeric_limits<DWORD>::max());
420 BSLS_ASSERT(0 == bsl::numeric_limits<ULONG64>::min());
421 BSLS_ASSERT(0xFFFFFFFFFFFFFFFFull == bsl::numeric_limits<ULONG64>::max());
435 DWORD sizeHigh32Bits;
436 const DWORD sizeLow32Bits = GetFileSize(descriptor, &sizeHigh32Bits);
443 static const DWORD k_INVALID_FILE_SIZE = 0xFFFFFFFFul;
444 if (k_INVALID_FILE_SIZE == sizeLow32Bits) {
445 const DWORD lastError = GetLastError();
447 static const DWORD k_NO_ERROR = 0;
448 if (k_NO_ERROR != lastError) {
453 const ULONG64 uSizeHigh32Bits =
static_cast<ULONG64
>(sizeHigh32Bits);
454 const ULONG64 uSizeLow32Bits =
static_cast<ULONG64
>(sizeLow32Bits);
455 const ULONG64 uSize64Bits = (uSizeHigh32Bits << 32) | uSizeLow32Bits;
457 return static_cast<Offset>(uSize64Bits);
460template <
class WINDOWS_INTERFACE>
465 static const LPFILETIME s_IGNORED_CREATION_TIME = 0;
466 static const LPFILETIME s_IGNORED_LAST_ACCESS_TIME = 0;
468 FILETIME lastWriteTime;
469 const BOOL getFileTimeSuccessFlag = GetFileTime(descriptor,
470 s_IGNORED_CREATION_TIME,
471 s_IGNORED_LAST_ACCESS_TIME,
473 if (!getFileTimeSuccessFlag) {
477 return convertFileTimeToDatetime(time, &lastWriteTime);
Definition bdlt_datetime.h:330
int addMicrosecondsIfValid(bsls::Types::Int64 microseconds)
Definition bdlt_datetime.h:2173
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLMT_ONCE_DO
Definition bslmt_once.h:427
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdls_fdstreambuf.h:412
Definition bdls_filesystemutil_windowsimputil.h:139
static int getLastModificationTime(bdlt::Datetime *time, FileDescriptor descriptor)
Definition bdls_filesystemutil_windowsimputil.h:461
static const bsls::Types::Int64 k_WINDOWS_TICKS_PER_MICROSECOND
Definition bdls_filesystemutil_windowsimputil.h:248
static const bsls::Types::Int64 k_NANOSECONDS_PER_WINDOWS_TICK
Definition bdls_filesystemutil_windowsimputil.h:246
WINDOWS_INTERFACE::HANDLE FileDescriptor
Definition bdls_filesystemutil_windowsimputil.h:145
WINDOWS_INTERFACE::INT64 Offset
Definition bdls_filesystemutil_windowsimputil.h:149
static Offset getFileSize(FileDescriptor descriptor)
Definition bdls_filesystemutil_windowsimputil.h:412
static int convertFileTimeToDatetime(bdlt::Datetime *time, const LPFILETIME lpFileTime)
Definition bdls_filesystemutil_windowsimputil.h:332
static const Datetime & epoch()
Definition bdlt_epochutil.h:397
static const bsls::Types::Int64 k_NANOSECONDS_PER_MICROSECOND
Definition bdlt_timeunitratio.h:207
Definition bslmf_isintegral.h:140
long long Int64
Definition bsls_types.h:134