// Returns file attributes. bool GetFileDetails(const std::string &filename, FileDetails *details) { #ifdef _WIN32 WIN32_FILE_ATTRIBUTE_DATA attr; if (!GetFileAttributesEx(ConvertUTF8ToWString(filename).c_str(), GetFileExInfoStandard, &attr)) return false; details->isDirectory = (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; details->size = ((u64)attr.nFileSizeHigh << 32) | (u64)attr.nFileSizeLow; details->atime = FiletimeToStatTime(attr.ftLastAccessTime); details->mtime = FiletimeToStatTime(attr.ftLastWriteTime); details->ctime = FiletimeToStatTime(attr.ftCreationTime); if (attr.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { details->access = 0444; // Read } else { details->access = 0666; // Read/Write } if (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { details->access |= 0111; // Execute } return true; #else if (!Exists(filename)) { return false; } #if __ANDROID__ && __ANDROID_API__ < 21 struct stat buf; if (stat(filename.c_str(), &buf) == 0) { #else struct stat64 buf; if (stat64(filename.c_str(), &buf) == 0) { #endif details->size = buf.st_size; details->isDirectory = S_ISDIR(buf.st_mode); details->atime = buf.st_atime; details->mtime = buf.st_mtime; details->ctime = buf.st_ctime; details->access = buf.st_mode & 0x1ff; return true; } else { return false; } #endif } bool GetModifTime(const std::string &filename, tm &return_time) { memset(&return_time, 0, sizeof(return_time)); FileDetails details; if (GetFileDetails(filename, &details)) { time_t t = details.mtime; localtime_r((time_t*)&t, &return_time); return true; } else { return false; } }
// Returns file attributes. bool GetFileDetails(const std::string &filename, FileDetails *details) { #ifdef _WIN32 WIN32_FILE_ATTRIBUTE_DATA attr; if (!GetFileAttributesEx(ConvertUTF8ToWString(filename).c_str(), GetFileExInfoStandard, &attr)) return false; details->isDirectory = (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; details->size = ((u64)attr.nFileSizeHigh << 32) | (u64)attr.nFileSizeLow; details->atime = FiletimeToStatTime(attr.ftLastAccessTime); details->mtime = FiletimeToStatTime(attr.ftLastWriteTime); details->ctime = FiletimeToStatTime(attr.ftCreationTime); if (attr.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { details->access = 0444; // Read } else { details->access = 0666; // Read/Write } if (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { details->access |= 0111; // Execute } return true; #else if (!Exists(filename)) { return false; } struct stat64 buf; if (stat64(filename.c_str(), &buf) == 0) { details->size = buf.st_size; details->isDirectory = S_ISDIR(buf.st_mode); details->atime = buf.st_atime; details->mtime = buf.st_mtime; details->ctime = buf.st_ctime; details->access = buf.st_mode & 0x1ff; return true; } else { return false; } #endif }