int LastModifiedFile(const char *name, double *tp) { #ifdef __WINDOWS__ HANDLE hFile; wchar_t wfile[MAXPATHLEN]; #define nano * 0.000000001 #define ntick 100.0 #define SEC_TO_UNIX_EPOCH 11644473600.0 if ( !_xos_os_filenameW(name, wfile, MAXPATHLEN) ) return FALSE; if ( (hFile=CreateFileW(wfile, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) != INVALID_HANDLE_VALUE ) { FILETIME wt; int rc; rc = GetFileTime(hFile, NULL, NULL, &wt); CloseHandle(hFile); if ( rc ) { double t; t = (double)wt.dwHighDateTime * (4294967296.0 * ntick nano); t += (double)wt.dwLowDateTime * (ntick nano); t -= SEC_TO_UNIX_EPOCH; *tp = t; return TRUE; } } set_posix_error(GetLastError()); return FALSE; #else char tmp[MAXPATHLEN]; statstruct buf; if ( statfunc(OsPath(name, tmp), &buf) < 0 ) return FALSE; #ifdef HAVE_STRUCT_STAT_ST_MTIM *tp = (double)buf.st_mtim.tv_sec + (double)buf.st_mtim.tv_nsec/1.0e9; #else *tp = (double)buf.st_mtime; #endif return TRUE; #endif }
static int LastModifiedFile64(const char *name, int64_t *tp) { #ifdef __WINDOWS__ HANDLE hFile; wchar_t wfile[MAXPATHLEN]; #define nano * 0.000000001 #define ntick 100.0 #define SEC_TO_UNIX_EPOCH 11644473600.0 if ( !_xos_os_filenameW(name, wfile, MAXPATHLEN) ) return FALSE; if ( (hFile=CreateFileW(wfile, 0, FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) != INVALID_HANDLE_VALUE ) { FILETIME wt; int rc; rc = GetFileTime(hFile, NULL, NULL, (FILETIME *)&wt); CloseHandle(hFile); if ( rc ) { LARGE_INTEGER date, adjust; date.HighPart = wt.dwHighDateTime; date.LowPart = wt.dwLowDateTime; adjust.QuadPart = 11644473600000 * 10000; date.QuadPart -= adjust.QuadPart; date.QuadPart /= 10000000; *tp = date.QuadPart; return TRUE; } } set_posix_error(GetLastError()); return FALSE; #else char tmp[MAXPATHLEN]; statstruct buf; #ifdef __ANDROID__ if (Yap_isAsset(name)) { if ( statfunc(OsPath("/", tmp), &buf) < 0 ) { return FALSE; } *tp = (int64_t)buf.st_mtime; return Yap_AccessAsset(name, R_OK); } #endif if ( statfunc(OsPath(name, tmp), &buf) < 0 ){ return FALSE; } *tp = (int64_t)buf.st_mtime; return TRUE; #endif }