filetime,systemtime相互转化,获取文件创建时间,访问时间,修改时间,获取指定时间之前之后的SYSTEMTIME

本文详细介绍了在Windows环境下如何使用C++进行时间的获取、转换和计算,包括UTC时间与本地时间的相互转换,以及如何通过FILETIME结构体进行时间戳的处理。此外,还展示了如何获取文件的创建、修改和访问时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// deleteOldFiles.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <sys/types.h>
#include <sys/stat.h>

using namespace std;
#pragma warning(disable:4996)
int main()
{
	//typedef struct _SYSTEMTIME {
	//	WORDwYear;
	//	WORDwMonth;
	//	WORDwDayOfWeek;
	//	WORDwDay;
	//	WORDwHour;
	//	WORDwMinute;
	//	WORDwSecond;
	//	WORDwMilliseconds;
	//} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;

	//得到当前UTC时间
	SYSTEMTIME st;
	GetSystemTime(&st);
	char buf[128] = { 0 };
	sprintf_s(buf,"%04d-%02d-%02d %02d:%02d:%02d:%03d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds);
	cout << "UTC时间为" << buf << endl;

	//得到本地时间
	SYSTEMTIME stLocal;
	GetLocalTime(&stLocal);
	memset(buf, 0, 128);
	sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wMilliseconds);
	cout << "本地时间为" << buf << endl;

	//FileTime:Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC时间).
	//从1601到现在经历的100纳秒数,8个字节变量
	//typedef struct _FILETIME {
	//	DWORDdwLowDateTime;
	//	DWORDdwHighDateTime;
	//} FILETIME, *PFILETIME, *LPFILETIME;

	//SYSTEMTIME转成FILETIME
	//BOOL
	//	WINAPI
	//	SystemTimeToFileTime(
	//		_In_ CONST SYSTEMTIME * lpSystemTime,
	//		_Out_ LPFILETIME lpFileTime
	//	);
	//SYSTEMTIME转FILETIME
	FILETIME ft;
	SystemTimeToFileTime(&st, &ft);
	//FILETIME转SYSTEMTIME
	SYSTEMTIME st2;
	FileTimeToSystemTime(&ft, &st2);
	memset(buf, 0, 128);
	sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", st2.wYear, st2.wMonth, st2.wDay, st2.wHour, st2.wMinute, st2.wSecond, st2.wMilliseconds);
	cout << "UTC时间为" << buf << endl;

	//当地时间转UTC时间
	FILETIME ftLocal;
	SystemTimeToFileTime(&stLocal, &ftLocal);
	LocalFileTimeToFileTime(&ftLocal, &ft);
	FileTimeToSystemTime(&ft, &st2);
	memset(buf, 0, 128);
	sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", st2.wYear, st2.wMonth, st2.wDay, st2.wHour, st2.wMinute, st2.wSecond, st2.wMilliseconds);
	cout << "UTC时间为" << buf << endl;

	FileTimeToLocalFileTime(&ft, &ftLocal);
	FileTimeToSystemTime(&ftLocal, &stLocal);
	memset(buf, 0, 128);
	sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond, stLocal.wMilliseconds);
	cout << "本地时间为" << buf << endl;

	//获取十天之前的日期
	ULARGE_INTEGER u1,offset,u2;
	offset.QuadPart = UInt32x32To64(10 * 24 * 3600, 10000000);
	u1.LowPart = ftLocal.dwLowDateTime;
	u1.HighPart = ftLocal.dwHighDateTime;
	u2.QuadPart = u1.QuadPart - offset.QuadPart;
	ftLocal.dwLowDateTime = u2.LowPart;
	ftLocal.dwHighDateTime = u2.HighPart;
	SYSTEMTIME stOld;
	FileTimeToSystemTime(&ftLocal, &stOld);
	memset(buf, 0, 128);
	sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", stOld.wYear, stOld.wMonth, stOld.wDay, stOld.wHour, stOld.wMinute, stOld.wSecond, stOld.wMilliseconds);
	cout << "十天前时间为" << buf << endl;

	//获取文件的创建时间,修改时间,访问时间
	HANDLE handleFile = CreateFileW(L"F:\\output\\测试文档.docx", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if (handleFile != INVALID_HANDLE_VALUE)
	{
		FILETIME ftCreationTime, ftLastAccessTime, ftLastWriteTime;
		GetFileTime(handleFile, &ftCreationTime, &ftLastAccessTime, &ftLastWriteTime);
		SYSTEMTIME creatTime, accessTime, modifyTime;
		FILETIME ftCreationTimeLocal, ftLastAccessTimeLocal, stLastWriteTimeLocal;
		FileTimeToLocalFileTime(&ftCreationTime, &ftCreationTimeLocal);
		FileTimeToLocalFileTime(&ftLastAccessTime, &ftLastAccessTimeLocal);
		FileTimeToLocalFileTime(&ftLastWriteTime, &stLastWriteTimeLocal);

		FileTimeToSystemTime(&ftCreationTimeLocal, &creatTime);
		FileTimeToSystemTime(&ftLastAccessTimeLocal, &accessTime);
		FileTimeToSystemTime(&stLastWriteTimeLocal, &modifyTime);
		memset(buf, 0, 128);
		sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", creatTime.wYear, creatTime.wMonth, creatTime.wDay, creatTime.wHour, creatTime.wMinute, creatTime.wSecond, creatTime.wMilliseconds);
		cout << "创建时间为" << buf << endl;
		memset(buf, 0, 128);
		sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", accessTime.wYear, accessTime.wMonth, accessTime.wDay, accessTime.wHour, accessTime.wMinute, accessTime.wSecond, accessTime.wMilliseconds);
		cout << "访问时间为" << buf << endl;
		memset(buf, 0, 128);
		sprintf_s(buf, "%04d-%02d-%02d %02d:%02d:%02d:%03d", modifyTime.wYear, modifyTime.wMonth, modifyTime.wDay, modifyTime.wHour, modifyTime.wMinute, modifyTime.wSecond, modifyTime.wMilliseconds);
		cout << "修改时间为" << buf << endl;
		CloseHandle(handleFile);
	}
    return 0;
}

运行结果:

#include <iostream> #include <string> #include <windows.h> #include <vector> #include <iomanip> #include <sstream> using namespace std; // 转换FILETIME到本地时间字符串 string FileTimeToString(const FILETIME& ft) { SYSTEMTIME st; FileTimeToSystemTime(&ft, &st); char buffer[26]; sprintf_s(buffer, "%04d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); return string(buffer); } // 获取文件创建时间 FILETIME GetFileCreationTime(const string& filePath) { HANDLE hFile = CreateFileA(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); FILETIME ftCreation = {0}; if (hFile != INVALID_HANDLE_VALUE) { FILETIME ftAccess, ftWrite; if (GetFileTime(hFile, &ftCreation, &ftAccess, &ftWrite)) { // 时间获取成功 } CloseHandle(hFile); } return ftCreation; } // 比较两个FILETIME(time1 >= time2 返回true) bool CompareFileTime(const FILETIME& time1, const FILETIME& time2) { return (::CompareFileTime(&time1, &time2) >= 0); } // 搜索符合条件的文件 vector<string> SearchFiles(const string& directory, const string& fileType, const FILETIME& startTime, const FILETIME& endTime) { vector<string> result; string searchPath = directory + "\\*"; WIN32_FIND_DATAA findData; HANDLE hFind = FindFirstFileA(searchPath.c_str(), &findData); if (hFind != INVALID_HANDLE_VALUE) { do { // 跳过当前目录和上级目录 if (strcmp(findData.cFileName, ".") == 0 || strcmp(findData.cFileName, "..") == 0) { continue; } // 构建完整路径 string fullPath = directory + "\\" + findData.cFileName; // 处理目录递归搜索 if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { vector<string> subFiles = SearchFiles(fullPath, fileType, startTime, endTime); result.insert(result.end(), subFiles.begin(), subFiles.end()); continue; } // 检查文件类型 string fileName = findData.cFileName; size_t dotPos = fileName.find_last_of('.'); string ext = (dotPos != string::npos) ? fileName.substr(dotPos + 1) : ""; if (!fileType.empty() && _stricmp(ext.c_str(), fileType.c_str()) != 0) { continue; } // 检查创建时间 FILETIME creationTime = findData.ftCreationTime; if ((CompareFileTime(creationTime, startTime) || (startTime.dwHighDateTime == 0 && startTime.dwLowDateTime == 0)) && (CompareFileTime(endTime, creationTime) || (endTime.dwHighDateTime == 0 && endTime.dwLowDateTime == 0))) { result.push_back(fullPath); } } while (FindNextFileA(hFind, &findData) != 0); FindClose(hFind); } return result; } // 重命名文件 bool RenameFile(const string& oldPath, const string& newPath) { if (MoveFileA(oldPath.c_str(), newPath.c_str())) { cout << "成功: " << oldPath << " -> " << newPath << endl; return true; } else { DWORD error = GetLastError(); cout << "错误: 重命名失败 - " << oldPath << " 错误码: " << error << endl; return false; } } // 转换用户输入的日期为FILETIME FILETIME StringToFileTime(const string& dateStr) { SYSTEMTIME st = {0}; if (dateStr.length() >= 10) { sscanf_s(dateStr.c_str(), "%4d-%2d-%2d", &st.wYear, &st.wMonth, &st.wDay); FILETIME ft; SystemTimeToFileTime(&st, &ft); return ft; } // 返回0表示不限制时间 FILETIME zero = {0}; return zero; } int main() { cout << "===== 文件搜索与重命名工具 (VS2008兼容版) =====" << endl; // 设置搜索目录 string directory; cout << "请输入搜索目录 (例如: C:\\MyFiles): "; getline(cin, directory); // 获取文件类型筛选条件 string fileType; cout << "请输入文件类型 (如txt, jpg, 留空则不限制): "; getline(cin, fileType); // 获取时间范围 string startDate, endDate; cout << "请输入开始日期 (格式: YYYY-MM-DD, 留空则不限制): "; getline(cin, startDate); cout << "请输入结束日期 (格式: YYYY-MM-DD, 留空则不限制): "; getline(cin, endDate); FILETIME startTime = StringToFileTime(startDate); FILETIME endTime = StringToFileTime(endDate); // 搜索文件 cout << "\n正在搜索文件..." << endl; vector<string> files = SearchFiles(directory, fileType, startTime, endTime); if (files.empty()) { cout << "未找到符合条件的文件!" << endl; system("pause"); return 0; } // 显示搜索结果 cout << "\n找到 " << files.size() << " 个文件:" << endl; for (size_t i = 0; i < files.size(); i++) { size_t pos = files[i].find_last_of("\\/"); string fileName = (pos != string::npos) ? files[i].substr(pos + 1) : files[i]; cout << "[" << setw(3) << i+1 << "] " << fileName << endl; } // 选择重命名模式 int renameMode; cout << "\n请选择重命名模式:" << endl; cout << "1. 添加前缀" << endl; cout << "2. 添加后缀" << endl; cout << "3. 替换文本" << endl; cout << "4. 序列编号" << endl; cout << "请输入选项 (1-4): "; cin >> renameMode; cin.ignore(); string prefix, suffix, oldText, newText; int startNum = 1; string format; switch (renameMode) { case 1: cout << "请输入要添加的前缀: "; getline(cin, prefix); break; case 2: cout << "请输入要添加的后缀: "; getline(cin, suffix); break; case 3: cout << "请输入要替换的文本: "; getline(cin, oldText); cout << "请输入替换后的文本: "; getline(cin, newText); break; case 4: cout << "请输入起始编号: "; cin >> startNum; cin.ignore(); cout << "请输入格式字符串 (例如: file_%%03d): "; getline(cin, format); break; default: cout << "无效的选项!" << endl; system("pause"); return 1; } // 执行重命名 int successCount = 0; cout << "\n==== 开始重命名 ====" << endl; for (size_t i = 0; i < files.size(); i++) { string filePath = files[i]; size_t lastSlash = filePath.find_last_of("\\/"); size_t lastDot = filePath.find_last_of("."); string path = (lastSlash != string::npos) ? filePath.substr(0, lastSlash + 1) : ""; string fileName = (lastSlash != string::npos) ? filePath.substr(lastSlash + 1) : filePath; string name = (lastDot != string::npos && lastDot > lastSlash) ? fileName.substr(0, lastDot - lastSlash - 1) : fileName; string ext = (lastDot != string::npos && lastDot > lastSlash) ? fileName.substr(lastDot) : ""; string newName; if (renameMode == 1) { newName = prefix + name + ext; } else if (renameMode == 2) { newName = name + suffix + ext; } else if (renameMode == 3) { // 替换文本 size_t pos = 0; while ((pos = name.find(oldText, pos)) != string::npos) { name.replace(pos, oldText.length(), newText); pos += newText.length(); } newName = name + ext; } else if (renameMode == 4) { // 序列编号 char numBuffer[20]; sprintf_s(numBuffer, format.c_str(), startNum++); newName = numBuffer + ext; } string newFilePath = path + newName; if (RenameFile(filePath, newFilePath)) { successCount++; } } cout << "\n==== 重命名完成 ====" << endl; cout << "成功重命名 " << successCount << " 个文件" << endl; cout << "失败 " << files.size() - successCount << " 个" << endl; system("pause"); return 0; }运行后出现错误:TEST_file_Rename.exe 中的 0x7c812aeb 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0012f740 处的 std::out_of_range。基于vs2008向我提供优化后的代码
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值