added and partly implemented the time functions for wxFileName
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -135,7 +135,7 @@ public:
|
|||||||
static wxFileName FileName(const wxString& file);
|
static wxFileName FileName(const wxString& file);
|
||||||
static wxFileName DirName(const wxString& dir);
|
static wxFileName DirName(const wxString& dir);
|
||||||
|
|
||||||
// test for existence
|
// file tests
|
||||||
|
|
||||||
// is the filename valid at all?
|
// is the filename valid at all?
|
||||||
bool IsOk() const { return !m_dirs.IsEmpty() || !m_name.IsEmpty(); }
|
bool IsOk() const { return !m_dirs.IsEmpty() || !m_name.IsEmpty(); }
|
||||||
@@ -148,11 +148,33 @@ public:
|
|||||||
bool DirExists();
|
bool DirExists();
|
||||||
static bool DirExists( const wxString &dir );
|
static bool DirExists( const wxString &dir );
|
||||||
|
|
||||||
// Well, get modification time with sec resolution
|
|
||||||
wxDateTime GetModificationTime();
|
|
||||||
|
|
||||||
// VZ: also need: IsDirWritable(), IsFileExecutable() &c (TODO)
|
// VZ: also need: IsDirWritable(), IsFileExecutable() &c (TODO)
|
||||||
|
|
||||||
|
// time functions
|
||||||
|
|
||||||
|
// set the file creation and last access/mod times
|
||||||
|
// (any of the pointers may be NULL)
|
||||||
|
bool SetTimes(const wxDateTime *dtCreate,
|
||||||
|
const wxDateTime *dtAccess,
|
||||||
|
const wxDateTime *dtMod);
|
||||||
|
|
||||||
|
// set the access and modification times to the current moment
|
||||||
|
bool Touch();
|
||||||
|
|
||||||
|
// return the last access, last modification and last change times
|
||||||
|
// (any of the pointers may be NULL)
|
||||||
|
bool GetTimes(wxDateTime *dtAccess,
|
||||||
|
wxDateTime *dtMod,
|
||||||
|
wxDateTime *dtChange) const;
|
||||||
|
|
||||||
|
// convenience wrapper: get just the last mod time of the file
|
||||||
|
wxDateTime GetModificationTime() const
|
||||||
|
{
|
||||||
|
wxDateTime dtMod;
|
||||||
|
(void)GetTimes(NULL, &dtMod, NULL);
|
||||||
|
return dtMod;
|
||||||
|
}
|
||||||
|
|
||||||
// various file/dir operations
|
// various file/dir operations
|
||||||
|
|
||||||
// retrieve the value of the current working directory
|
// retrieve the value of the current working directory
|
||||||
|
@@ -39,15 +39,97 @@
|
|||||||
#include "wx/utils.h"
|
#include "wx/utils.h"
|
||||||
|
|
||||||
#if wxUSE_DYNLIB_CLASS
|
#if wxUSE_DYNLIB_CLASS
|
||||||
#include "wx/dynlib.h"
|
#include "wx/dynlib.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// For GetShort/LongPathName
|
// For GetShort/LongPathName
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include "wx/msw/winundef.h"
|
|
||||||
|
#include "wx/msw/winundef.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// utime() is POSIX so should normally be available on all Unices
|
||||||
|
#ifdef __UNIX_LIKE__
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <utime.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// small helper class which opens and closes the file - we use it just to get
|
||||||
|
// a file handle for the given file name to pass it to some Win32 API function
|
||||||
|
#ifdef __WIN32__
|
||||||
|
|
||||||
|
class wxFileHandle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
wxFileHandle(const wxString& filename)
|
||||||
|
{
|
||||||
|
m_hFile = ::CreateFile
|
||||||
|
(
|
||||||
|
filename, // name
|
||||||
|
GENERIC_READ, // access mask
|
||||||
|
0, // no sharing
|
||||||
|
NULL, // no secutity attr
|
||||||
|
OPEN_EXISTING, // creation disposition
|
||||||
|
0, // no flags
|
||||||
|
NULL // no template file
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( m_hFile == INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Failed to open '%s' for reading"),
|
||||||
|
filename.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~wxFileHandle()
|
||||||
|
{
|
||||||
|
if ( m_hFile != INVALID_HANDLE_VALUE )
|
||||||
|
{
|
||||||
|
if ( !::CloseHandle(m_hFile) )
|
||||||
|
{
|
||||||
|
wxLogSysError(_("Failed to close file handle"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// return TRUE only if the file could be opened successfully
|
||||||
|
bool IsOk() const { return m_hFile != INVALID_HANDLE_VALUE; }
|
||||||
|
|
||||||
|
// get the handle
|
||||||
|
operator HANDLE() const { return m_hFile; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE m_hFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __WIN32__
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// private functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __WIN32__
|
||||||
|
|
||||||
|
// convert between wxDateTime and FILETIME which is a 64-bit value representing
|
||||||
|
// the number of 100-nanosecond intervals since January 1, 1601.
|
||||||
|
|
||||||
|
static void ConvertWxToFileTime(FILETIME *ft, const wxDateTime& dt)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ConvertFileTimeToWx(wxDateTime *dt, const FILETIME &ft)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __WIN32__
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// implementation
|
// implementation
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -152,13 +234,6 @@ bool wxFileName::DirExists( const wxString &dir )
|
|||||||
return ::wxDirExists( dir );
|
return ::wxDirExists( dir );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxDateTime wxFileName::GetModificationTime()
|
|
||||||
{
|
|
||||||
wxDateTime ret( wxFileModificationTime( GetFullPath() ) );
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// CWD and HOME stuff
|
// CWD and HOME stuff
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -814,3 +889,116 @@ void wxFileName::SplitPath(const wxString& fullpath,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// time functions
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxFileName::SetTimes(const wxDateTime *dtCreate,
|
||||||
|
const wxDateTime *dtAccess,
|
||||||
|
const wxDateTime *dtMod)
|
||||||
|
{
|
||||||
|
#if defined(__UNIX_LIKE__)
|
||||||
|
utimbuf utm;
|
||||||
|
utm.actime = dtAccess ? dtAccess : dtAccess->GetTicks();
|
||||||
|
utm.modtime = dtMod ? dtMod : dtMod->GetTicks();
|
||||||
|
if ( utime(GetFullPath(), &utm) == 0 )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#elif defined(__WIN32__)
|
||||||
|
wxFileHandle fh(GetFullPath());
|
||||||
|
if ( fh.IsOk() )
|
||||||
|
{
|
||||||
|
FILETIME ftAccess, ftCreate, ftWrite;
|
||||||
|
|
||||||
|
if ( dtCreate )
|
||||||
|
ConvertWxToFileTime(&ftCreate, *dtCreate);
|
||||||
|
if ( dtAccess )
|
||||||
|
ConvertWxToFileTime(&ftAccess, *dtAccess);
|
||||||
|
if ( dtMod )
|
||||||
|
ConvertWxToFileTime(&ftWrite, *dtMod);
|
||||||
|
|
||||||
|
if ( ::SetFileTime(fh,
|
||||||
|
dtCreate ? &ftCreate : NULL,
|
||||||
|
dtAccess ? &ftAccess : NULL,
|
||||||
|
dtMod ? &ftWrite : NULL) )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else // other platform
|
||||||
|
#endif // platforms
|
||||||
|
|
||||||
|
wxLogSysError(_("Failed to modify file times for '%s'"),
|
||||||
|
GetFullPath().c_str());
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileName::Touch()
|
||||||
|
{
|
||||||
|
#if defined(__UNIX_LIKE__)
|
||||||
|
// under Unix touching file is simple: just pass NULL to utime()
|
||||||
|
if ( utime(GetFullPath(), NULL) == 0 )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLogSysError(_("Failed to touch the file '%s'"), GetFullPath().c_str());
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
#else // other platform
|
||||||
|
wxDateTime dtNow = wxDateTime::Now();
|
||||||
|
|
||||||
|
return SetTimes(NULL /* don't change create time */, &dtNow, &dtNow);
|
||||||
|
#endif // platforms
|
||||||
|
}
|
||||||
|
|
||||||
|
bool wxFileName::GetTimes(wxDateTime *dtAccess,
|
||||||
|
wxDateTime *dtMod,
|
||||||
|
wxDateTime *dtChange) const
|
||||||
|
{
|
||||||
|
#if defined(__UNIX_LIKE__)
|
||||||
|
wxStructStat stBuf;
|
||||||
|
if ( wxStat(GetFullPath(), &stBuf) == 0 )
|
||||||
|
{
|
||||||
|
if ( dtAccess )
|
||||||
|
dtAccess->Set(stBuf.st_atime);
|
||||||
|
if ( dtMod )
|
||||||
|
dtMod->Set(stBuf.st_mtime);
|
||||||
|
if ( dtChange )
|
||||||
|
dtChange->Set(stBuf.st_ctime);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#elif defined(__WIN32__)
|
||||||
|
wxFileHandle fh(GetFullPath());
|
||||||
|
if ( fh.IsOk() )
|
||||||
|
{
|
||||||
|
FILETIME ftAccess, ftCreate, ftWrite;
|
||||||
|
|
||||||
|
if ( ::GetFileTime(fh,
|
||||||
|
dtMod ? &ftCreate : NULL,
|
||||||
|
dtAccess ? &ftAccess : NULL,
|
||||||
|
dtChange ? &ftWrite : NULL) )
|
||||||
|
{
|
||||||
|
if ( dtMod )
|
||||||
|
ConvertFileTimeToWx(dtMod, ftCreate);
|
||||||
|
if ( dtAccess )
|
||||||
|
ConvertFileTimeToWx(dtAccess, ftAccess);
|
||||||
|
if ( dtChange )
|
||||||
|
ConvertFileTimeToWx(dtChange, ftWrite);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else // other platform
|
||||||
|
#endif // platforms
|
||||||
|
|
||||||
|
wxLogSysError(_("Failed to retrieve file times for '%s'"),
|
||||||
|
GetFullPath().c_str());
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user