window下MFC文件按时间排序

这些天需要用到按时间显示最新的图片,网上暂时也没找到现成,偷懒一下也不行~~
整合查找的,省的到处找。作为一个搬运工居然也嫌麻烦了…

主要思路是:

  1. 通过CFileFind查找所有目录下的文件,保存在vector1里面
  2. 然后GetFileTime读取各个文件的创建时间、最后使用时间、最后修改的时间,转为time_t类型,仍然保存到另一个 vector2里面
  3. 接着对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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值