Index: runtime/bin/file_win.cc |
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc |
index 3cfdf69b2158b368b5b2a6026236e91f65ebad7c..9101ee6673b74fc53b2b0336ccbfa73fb49b1105 100644 |
--- a/runtime/bin/file_win.cc |
+++ b/runtime/bin/file_win.cc |
@@ -12,6 +12,7 @@ |
#include <stdio.h> // NOLINT |
#include <string.h> // NOLINT |
#include <sys/stat.h> // NOLINT |
+#include <sys/utime.h> // NOLINT |
#include <WinIoCtl.h> // NOLINT |
#include "bin/builtin.h" |
@@ -255,15 +256,23 @@ File* File::OpenStdio(int fd) { |
} |
+static bool StatHelper(wchar_t* path, struct __stat64* st) { |
+ int stat_status = _wstat64(path, st); |
+ if (stat_status != 0) { |
+ return false; |
+ } |
+ if ((st->st_mode & S_IFMT) != S_IFREG) { |
+ SetLastError(ERROR_NOT_SUPPORTED); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+ |
bool File::Exists(const char* name) { |
struct __stat64 st; |
Utf8ToWideScope system_name(name); |
- bool stat_status = _wstat64(system_name.wide(), &st); |
- if (stat_status == 0) { |
- return ((st.st_mode & S_IFMT) == S_IFREG); |
- } else { |
- return false; |
- } |
+ return StatHelper(system_name.wide(), &st); |
} |
@@ -442,16 +451,10 @@ bool File::Copy(const char* old_path, const char* new_path) { |
int64_t File::LengthFromPath(const char* name) { |
struct __stat64 st; |
Utf8ToWideScope system_name(name); |
- int stat_status = _wstat64(system_name.wide(), &st); |
- if (stat_status == 0) { |
- if ((st.st_mode & S_IFMT) == S_IFREG) { |
- return st.st_size; |
- } else { |
- // ERROR_DIRECTORY_NOT_SUPPORTED is not always in the message table. |
- SetLastError(ERROR_NOT_SUPPORTED); |
- } |
+ if (!StatHelper(system_name.wide(), &st)) { |
+ return -1; |
} |
- return -1; |
+ return st.st_size; |
} |
@@ -539,19 +542,55 @@ void File::Stat(const char* name, int64_t* data) { |
} |
+time_t File::LastAccessed(const char* name) { |
+ struct __stat64 st; |
+ Utf8ToWideScope system_name(name); |
+ if (!StatHelper(system_name.wide(), &st)) { |
+ return -1; |
+ } |
+ return st.st_atime; |
+} |
+ |
+ |
time_t File::LastModified(const char* name) { |
struct __stat64 st; |
Utf8ToWideScope system_name(name); |
- int stat_status = _wstat64(system_name.wide(), &st); |
- if (stat_status == 0) { |
- if ((st.st_mode & S_IFMT) == S_IFREG) { |
- return st.st_mtime; |
- } else { |
- // ERROR_DIRECTORY_NOT_SUPPORTED is not always in the message table. |
- SetLastError(ERROR_NOT_SUPPORTED); |
- } |
+ if (!StatHelper(system_name.wide(), &st)) { |
+ return -1; |
} |
- return -1; |
+ return st.st_mtime; |
+} |
+ |
+ |
+bool File::SetLastAccessed(const char* name, int64_t millis) { |
+ // First get the current times. |
+ struct __stat64 st; |
+ Utf8ToWideScope system_name(name); |
+ if (!StatHelper(system_name.wide(), &st)) { |
+ return false; |
+ } |
+ |
+ // Set the new time: |
+ struct __utimbuf64 times; |
+ times.actime = millis / kMillisecondsPerSecond; |
+ times.modtime = st.st_mtime; |
+ return _wutime64(system_name.wide(), ×) == 0; |
+} |
+ |
+ |
+bool File::SetLastModified(const char* name, int64_t millis) { |
+ // First get the current times. |
+ struct __stat64 st; |
+ Utf8ToWideScope system_name(name); |
+ if (!StatHelper(system_name.wide(), &st)) { |
+ return false; |
+ } |
+ |
+ // Set the new time: |
+ struct __utimbuf64 times; |
+ times.actime = st.st_atime; |
+ times.modtime = millis / kMillisecondsPerSecond; |
+ return _wutime64(system_name.wide(), ×) == 0; |
} |