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:
Vadim Zeitlin
2001-10-30 02:41:30 +00:00
parent 9f51f2b678
commit 951cd18031
2 changed files with 224 additions and 14 deletions

View File

@@ -135,7 +135,7 @@ public:
static wxFileName FileName(const wxString& file);
static wxFileName DirName(const wxString& dir);
// test for existence
// file tests
// is the filename valid at all?
bool IsOk() const { return !m_dirs.IsEmpty() || !m_name.IsEmpty(); }
@@ -148,11 +148,33 @@ public:
bool DirExists();
static bool DirExists( const wxString &dir );
// Well, get modification time with sec resolution
wxDateTime GetModificationTime();
// 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
// retrieve the value of the current working directory

View File

@@ -39,15 +39,97 @@
#include "wx/utils.h"
#if wxUSE_DYNLIB_CLASS
#include "wx/dynlib.h"
#include "wx/dynlib.h"
#endif
// For GetShort/LongPathName
#ifdef __WIN32__
#include <windows.h>
#include "wx/msw/winundef.h"
#include <windows.h>
#include "wx/msw/winundef.h"
#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
// ============================================================================
@@ -152,13 +234,6 @@ bool wxFileName::DirExists( const wxString &dir )
return ::wxDirExists( dir );
}
wxDateTime wxFileName::GetModificationTime()
{
wxDateTime ret( wxFileModificationTime( GetFullPath() ) );
return ret;
}
// ----------------------------------------------------------------------------
// 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;
}