+
+/* static */
+void wxFileName::SplitPath(const wxString& fullpath,
+ wxString *path,
+ wxString *name,
+ wxString *ext,
+ wxPathFormat format)
+{
+ wxString volume;
+ SplitPath(fullpath, &volume, path, name, ext, format);
+
+ if ( path && !volume.empty() )
+ {
+ path->Prepend(volume + GetVolumeSeparator(format));
+ }
+}
+
+// ----------------------------------------------------------------------------
+// time functions
+// ----------------------------------------------------------------------------
+
+bool wxFileName::SetTimes(const wxDateTime *dtCreate,
+ const wxDateTime *dtAccess,
+ const wxDateTime *dtMod)
+{
+#if defined(__UNIX_LIKE__) || (defined(__DOS__) && defined(__WATCOMC__))
+ if ( !dtAccess && !dtMod )
+ {
+ // can't modify the creation time anyhow, don't try
+ return TRUE;
+ }
+
+ // if dtAccess or dtMod is not specified, use the other one (which must be
+ // non NULL because of the test above) for both times
+ utimbuf utm;
+ utm.actime = dtAccess ? dtAccess->GetTicks() : dtMod->GetTicks();
+ utm.modtime = dtMod ? dtMod->GetTicks() : dtAccess->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__) || defined(__WXMAC__) || (defined(__DOS__) && defined(__WATCOMC__))
+ 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;
+}
+