From 374db6aebec2a008538c7708305b9be01000c013 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 22 Jul 2017 14:15:35 +0200 Subject: Add touch_file() filesystem function --- libbutl/filesystem.cxx | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'libbutl/filesystem.cxx') diff --git a/libbutl/filesystem.cxx b/libbutl/filesystem.cxx index 70597b9..7ba5275 100644 --- a/libbutl/filesystem.cxx +++ b/libbutl/filesystem.cxx @@ -6,6 +6,7 @@ #ifndef _WIN32 # include // rename() +# include // utime() # include // struct dirent, *dir() # include // symlink(), link(), stat(), rmdir(), unlink() # include // utimes() @@ -18,6 +19,7 @@ # include // _mkdir(), _rmdir() # include // _stat # include // _stat(), S_I* +# include // _utime() # ifdef _MSC_VER // Unlikely to be fixed in newer versions. # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) @@ -153,6 +155,33 @@ namespace butl } #endif + bool + touch_file (const path& p, bool create) + { + if (file_exists (p)) + { +#ifndef _WIN32 + if (utime (p.string ().c_str (), nullptr) == -1) +#else + if (_utime (p.string ().c_str (), nullptr) == -1) +#endif + throw_generic_error (errno); + + return false; + } + + if (create && !entry_exists (p)) + { + // Assuming the file access and modification times are set to the + // current time automatically. + // + fdopen (p, fdopen_mode::out | fdopen_mode::create); + return true; + } + + throw_generic_error (ENOENT); // Does not exist or not a file. + } + mkdir_status #ifndef _WIN32 try_mkdir (const dir_path& p, mode_t m) -- cgit v1.1