这些天需要用到按时间显示最新的图片,网上暂时也没找到现成,偷懒一下也不行~~
整合查找的,省的到处找。作为一个搬运工居然也嫌麻烦了…
主要思路是:
- 通过CFileFind查找所有目录下的文件,保存在vector1里面
- 然后GetFileTime读取各个文件的创建时间、最后使用时间、最后修改的时间,转为time_t类型,仍然保存到另一个 vector2里面
- 接着对vector2排序,同时对vector1相应排序
找出所有文件
这里找的是jpg文件,保存在vector allFiles里面
//查找所有文件
std::vector<CString> allFiles;
CFileFind finder;
BOOL bWork = finder.FindFile(_T("d://img//*.jpg"));
while (bWork) {
bWork = finder.FindNextFile();
CString path = finder.GetFileName();
if (finder.IsDots()) continue;
if (finder.IsDirectory()) continue;
path.Insert(0, L"d://img//");
allFiles.push_back(path);
}
查找对应文件时间
可以和上面的查找文件写在一起,定义FILETIME保存文件时间,再转化为time_t类型,保存在vector fileAllTime里面。
用CFile打开文件,获取句柄
//查询所有的文件时间
std::vector<time_t> fileAllTime;
for (auto filename : allFiles) {
FILETIME fileTime, lastAccessTime, lastWriteTime;
SYSTEMTIME stUTC1, stLOCAL1;
CFile hFile(filename, CFile::modeRead);
if (!GetFileTime(hFile, &fileTime, &lastAccessTime, &lastWriteTime)) {
DWORD error = GetLastError();
std::cout << "error : " << error << std::endl;
continue;
}
//SYSTEMTIME --> time_t
LONGLONG nLL;
ULARGE_INTEGER ui;
ui.LowPart = lastWriteTime.dwLowDateTime;
ui.HighPart = lastWriteTime.dwHighDateTime;
nLL = (lastWriteTime.dwHighDateTime << 32) + lastWriteTime.dwLowDateTime;
time_t pt = (long)((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000);
//int curTime = time(&pt);
fileAllTime.push_back(pt);
hFile.Close();
}
按时间排序
对文件时间vector排序,同时也对应排序文件顺序。
调整difftime的判断,选择降序或者升序排列
//时间排序
for (int i = 0; i < fileAllTime.size(); i++) {
int min = i;
for (int j = min + 1; j < fileAllTime.size(); j++) {
if(difftime(fileAllTime[j], fileAllTime[min]) > 0){
int temp = fileAllTime[j];
fileAllTime[j] = fileAllTime[min];
fileAllTime[min] = temp;
CString name = allFiles[j];
allFiles[j] = allFiles[min];
allFiles[min] = name;
}
}
}
最后出来的allFiles,就是已经排序好了的jpg文件vector