/src/CMake/Source/cmFileTime.cxx
Line | Count | Source |
1 | | /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
2 | | file LICENSE.rst or https://cmake.org/licensing for details. */ |
3 | | #include "cmFileTime.h" |
4 | | |
5 | | #include <ctime> |
6 | | #include <string> |
7 | | |
8 | | // Use a platform-specific API to get file times efficiently. |
9 | | #if !defined(_WIN32) || defined(__CYGWIN__) |
10 | | # include "cm_sys_stat.h" |
11 | | #else |
12 | | # include <windows.h> |
13 | | |
14 | | # include "cmsys/Encoding.hxx" |
15 | | #endif |
16 | | |
17 | | bool cmFileTime::Load(std::string const& fileName) |
18 | 0 | { |
19 | 0 | #if !defined(_WIN32) || defined(__CYGWIN__) |
20 | | // POSIX version. Use the stat function. |
21 | 0 | struct stat fst; |
22 | 0 | if (::stat(fileName.c_str(), &fst) != 0) { |
23 | 0 | return false; |
24 | 0 | } |
25 | 0 | # if CMake_STAT_HAS_ST_MTIM |
26 | | // Nanosecond resolution |
27 | 0 | this->Time = fst.st_mtim.tv_sec * UtPerS + fst.st_mtim.tv_nsec; |
28 | | # elif CMake_STAT_HAS_ST_MTIMESPEC |
29 | | // Nanosecond resolution |
30 | | this->Time = fst.st_mtimespec.tv_sec * UtPerS + fst.st_mtimespec.tv_nsec; |
31 | | # else |
32 | | // Second resolution |
33 | | this->Time = fst.st_mtime * UtPerS; |
34 | | # endif |
35 | | #else |
36 | | // Windows version. Get the modification time from extended file attributes. |
37 | | WIN32_FILE_ATTRIBUTE_DATA fdata; |
38 | | if (!GetFileAttributesExW(cmsys::Encoding::ToWide(fileName).c_str(), |
39 | | GetFileExInfoStandard, &fdata)) { |
40 | | return false; |
41 | | } |
42 | | |
43 | | // Copy the file time to the output location. |
44 | | using uint64 = unsigned long long; |
45 | | |
46 | | this->Time = static_cast<TimeType>( |
47 | | (uint64(fdata.ftLastWriteTime.dwHighDateTime) << 32) + |
48 | | fdata.ftLastWriteTime.dwLowDateTime); |
49 | | #endif |
50 | 0 | return true; |
51 | 0 | } |