]> git.saurik.com Git - wxWidgets.git/commitdiff
added and partly implemented the time functions for wxFileName
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 30 Oct 2001 02:41:30 +0000 (02:41 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 30 Oct 2001 02:41:30 +0000 (02:41 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12205 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/filename.h
src/common/filename.cpp

index 06696bfdf207932e87250c73f16abc329a8a32b4..58ca5ecc30d669eec67816c49e1462acafb918b1 100644 (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
index d30a7f8ba13c62fb2e4b2275058ece6aef61d6b6..34fafde83d8a2df7c3ba64b1e4a43bc85e02dee2 100644 (file)
 #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;
+}
+