static bool ShouldReplaceWith(const VfsFile& previousFile, const VfsFile& newFile) { // 1) priority (override mods) if(newFile.Priority() < previousFile.Priority()) return false; if(newFile.Priority() > previousFile.Priority()) return true; // 2) timestamp { const double howMuchNewer = difftime(newFile.MTime(), previousFile.MTime()); const double threshold = 2.0; // FAT timestamp resolution [seconds] if(howMuchNewer > threshold) // newer return true; if(howMuchNewer < -threshold) // older return false; // else: "equal" (tolerating small differences due to FAT's low // mtime resolution) } // 3) precedence (efficiency of file provider) if(newFile.Loader()->Precedence() < previousFile.Loader()->Precedence()) return false; return true; }
std::wstring FileDescription(const VfsFile& file) { wchar_t timestamp[25]; const time_t mtime = file.MTime(); wcsftime(timestamp, ARRAY_SIZE(timestamp), L"%a %b %d %H:%M:%S %Y", localtime(&mtime)); wchar_t buf[200]; swprintf_s(buf, ARRAY_SIZE(buf), L"(%c; %6lu; %ls) %ls", file.Loader()->LocationCode(), (unsigned long)file.Size(), timestamp, file.Name().string().c_str()); return buf; }
virtual Status GetFileInfo(const VfsPath& pathname, FileInfo* pfileInfo) const { ScopedLock s; VfsDirectory* directory; VfsFile* file; Status ret = vfs_Lookup(pathname, &m_rootDirectory, directory, &file); if(!pfileInfo) // just indicate if the file exists without raising warnings. return ret; WARN_RETURN_STATUS_IF_ERR(ret); *pfileInfo = FileInfo(file->Name(), file->Size(), file->MTime()); return INFO::OK; }