Add SGPath::touch() helper
This commit is contained in:
parent
37bc43c7aa
commit
5c30ca5dc6
@ -35,9 +35,15 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if !defined(SG_WINDOWS)
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <utime.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SG_WINDOWS)
|
||||||
# include <direct.h>
|
# include <direct.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "sg_path.hxx"
|
#include "sg_path.hxx"
|
||||||
|
|
||||||
#include <boost/algorithm/string/case_conv.hpp>
|
#include <boost/algorithm/string/case_conv.hpp>
|
||||||
@ -52,13 +58,13 @@ using simgear::strutils::starts_with;
|
|||||||
static const char sgDirPathSep = '/';
|
static const char sgDirPathSep = '/';
|
||||||
static const char sgDirPathSepBad = '\\';
|
static const char sgDirPathSepBad = '\\';
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(SG_WINDOWS)
|
||||||
const char SGPath::pathListSep[] = ";"; // this is null-terminated
|
const char SGPath::pathListSep[] = ";"; // this is null-terminated
|
||||||
#else
|
#else
|
||||||
const char SGPath::pathListSep[] = ":"; // ditto
|
const char SGPath::pathListSep[] = ":"; // ditto
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(SG_WINDOWS)
|
||||||
#include <ShlObj.h> // for CSIDL
|
#include <ShlObj.h> // for CSIDL
|
||||||
// TODO: replace this include file with the official <versionhelpers.h> header
|
// TODO: replace this include file with the official <versionhelpers.h> header
|
||||||
// included in the Windows 8.1 SDK
|
// included in the Windows 8.1 SDK
|
||||||
@ -1048,3 +1054,40 @@ std::string SGPath::fileUrl() const
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
bool SGPath::touch()
|
||||||
|
{
|
||||||
|
if (!permissionsAllowsWrite())
|
||||||
|
{
|
||||||
|
SG_LOG(SG_IO, SG_WARN, "file touch failed: (" << *this << ")"
|
||||||
|
" reason: access denied" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!exists()) {
|
||||||
|
SG_LOG(SG_IO, SG_WARN, "file touch failed: (" << *this << ")"
|
||||||
|
" reason: missing file");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#if defined(SG_WINDOWS)
|
||||||
|
auto ws = wstr();
|
||||||
|
// set this link for docs on behaviour here, about passing nullptr
|
||||||
|
// https://msdn.microsoft.com/en-us/library/aa273399(v=vs.60).aspx
|
||||||
|
if (_wutime(ws.c_str(), nullptr) != 0) {
|
||||||
|
SG_LOG(SG_IO, SG_WARN, "file touch failed: (" << *this << ")"
|
||||||
|
" reason: _wutime failed with error:" << simgear::strutils::error_string(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (::utime(path.c_str(), nullptr) != 0) {
|
||||||
|
SG_LOG(SG_IO, SG_WARN, "file touch failed: (" << *this << ")"
|
||||||
|
" reason: utime failed with error:" << simgear::strutils::error_string(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// reset the cache flag so we re-stat() on next request
|
||||||
|
_cached = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@ -282,6 +282,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
std::string fileUrl() const;
|
std::string fileUrl() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the file modification timestamp to be 'now'. The contents will
|
||||||
|
* not be changed. (Same as POSIX 'touch' command). Will fail if the file
|
||||||
|
* does not exist or permissions do not allow writing.
|
||||||
|
*/
|
||||||
|
bool touch();
|
||||||
|
|
||||||
enum StandardLocation
|
enum StandardLocation
|
||||||
{
|
{
|
||||||
HOME,
|
HOME,
|
||||||
|
Loading…
Reference in New Issue
Block a user