vc函数GetFileTime获取文件夹的访问时间时问题?
我用该函数获取到的文件夹访问时间是错误的,我能获取上次别人或程序访问该文件夹的时间吗?而不是我程序现在访问文件夹的时间...
我用该函数获取到的文件夹访问时间是错误的,我能获取上次别人或程序访问该文件夹的时间吗?而不是我程序现在访问文件夹的时间
展开
2个回答
展开全部
通常,文件、文件夹的时间属性指的是创建时间、最近访问时间和最近修改时间等几个具体属性。对于文件的上述属性可以通过GetFileTime()来获取,对于文件夹,在通过CreateFile()函数将其打开后,其获取得到的句柄可以当作文件句柄来使用。因此,通过GetFileTime()函数同样也可以得到文件夹的时间属性。GetFileTime()函数原型如下:
BOOLGetFileTime(
HANDLE hFile, // 文件句柄
LPFILETIME lpCreationTime, // 创建时间的地址
LPFILETIME lpLastAccessTime, //最近访问时间的地址
LPFILETIME lpLastWriteTime // 最近修改时间的地址
);
其中后三个参数均是指向FILETIME结构的指针,得到的也都是UTC时间,如果需要,可以通过FileTimeToLocalFileTime()函数将此UTC时间转化成本地时间。而且还可以进一步通过FileTimeToSystemTime()函数将其从文件时间格式转化成系统时间格式,转化后的时间格式将保存在一个SYSTEMTIME结构对象中。类似的,在将时间信息写入到文件夹属性时,如果不是文件时间格式也应当通过SystemTimeToFileTime()函数将其从系统时间格式转换成文件时间格式,然后再通过SetFileTime()函数将指定的时间写入到文件夹的时间属性中去。这样,在进行数据备份和恢复的过程中,包括根目录在内的所有文件夹都可以保持时间属性的一致。
// 获取指定文件夹的时间属性,入口参数DirName指定了待处理的文件夹,
//stime为一指向SYSTEMTIME结构的指针
BOOLCSetForderTimeDlg::GetDirTime(CString DirName, SYSTEMTIME &stime){
// 打开文件夹
HANDLE hDir = CreateFile (DirName,GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夹的创建时间
FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
FILETIME lpLastWriteTime; // 文件夹的最近修改时间
// 获取文件夹时间属性信息
if (GetFileTime(hDir,&lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){
FILETIME ftime;
FileTimeToLocalFileTime(&lpLastWriteTime,&ftime); // 转换成本地时间
FileTimeToSystemTime(&ftime,&stime); // 转换成系统时间格式
}
CloseHandle(hDir); // 关闭打开过的文件夹
return retval;
}
// 设置指定文件夹的时间属性,入口参数DirName指定了待处理的文件夹,
//new_time为一指向SYSTEMTIME结构的指针
BOOLCSetForderTimeDlg::SetDirTime(CString DirName, SYSTEMTIME new_stime){
// 打开目录的Win32 API调用
HANDLE hDir = CreateFile(DirName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夹的创建时间
FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
FILETIME lpLastWriteTime; // 对文件夹的最近修改时间
SystemTimeToFileTime(&new_stime,&lpCreationTime); // 转换成文件时间格式
SystemTimeToFileTime(&new_stime,&lpLastAccessTime);
SystemTimeToFileTime(&new_stime,&lpLastWriteTime);
CloseHandle(hDir); // 关闭文件夹
return retval;
}
BOOLGetFileTime(
HANDLE hFile, // 文件句柄
LPFILETIME lpCreationTime, // 创建时间的地址
LPFILETIME lpLastAccessTime, //最近访问时间的地址
LPFILETIME lpLastWriteTime // 最近修改时间的地址
);
其中后三个参数均是指向FILETIME结构的指针,得到的也都是UTC时间,如果需要,可以通过FileTimeToLocalFileTime()函数将此UTC时间转化成本地时间。而且还可以进一步通过FileTimeToSystemTime()函数将其从文件时间格式转化成系统时间格式,转化后的时间格式将保存在一个SYSTEMTIME结构对象中。类似的,在将时间信息写入到文件夹属性时,如果不是文件时间格式也应当通过SystemTimeToFileTime()函数将其从系统时间格式转换成文件时间格式,然后再通过SetFileTime()函数将指定的时间写入到文件夹的时间属性中去。这样,在进行数据备份和恢复的过程中,包括根目录在内的所有文件夹都可以保持时间属性的一致。
// 获取指定文件夹的时间属性,入口参数DirName指定了待处理的文件夹,
//stime为一指向SYSTEMTIME结构的指针
BOOLCSetForderTimeDlg::GetDirTime(CString DirName, SYSTEMTIME &stime){
// 打开文件夹
HANDLE hDir = CreateFile (DirName,GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夹的创建时间
FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
FILETIME lpLastWriteTime; // 文件夹的最近修改时间
// 获取文件夹时间属性信息
if (GetFileTime(hDir,&lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){
FILETIME ftime;
FileTimeToLocalFileTime(&lpLastWriteTime,&ftime); // 转换成本地时间
FileTimeToSystemTime(&ftime,&stime); // 转换成系统时间格式
}
CloseHandle(hDir); // 关闭打开过的文件夹
return retval;
}
// 设置指定文件夹的时间属性,入口参数DirName指定了待处理的文件夹,
//new_time为一指向SYSTEMTIME结构的指针
BOOLCSetForderTimeDlg::SetDirTime(CString DirName, SYSTEMTIME new_stime){
// 打开目录的Win32 API调用
HANDLE hDir = CreateFile(DirName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夹的创建时间
FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
FILETIME lpLastWriteTime; // 对文件夹的最近修改时间
SystemTimeToFileTime(&new_stime,&lpCreationTime); // 转换成文件时间格式
SystemTimeToFileTime(&new_stime,&lpLastAccessTime);
SystemTimeToFileTime(&new_stime,&lpLastWriteTime);
CloseHandle(hDir); // 关闭文件夹
return retval;
}
展开全部
#include <windows.h>
int main(void)
{
HANDLE hFile = CreateFile(_T("c:\\aa.dat"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
FILETIME createTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
if ( INVALID_HANDLE_VALUE != hFile )
{
if ( GetFileTime(hFile,&createTime,&lastAccessTime,&lastWriteTime) )
{
SYSTEMTIME st;
memset(&st,0x0,sizeof(st));
FileTimeToSystemTime(&lastAccessTime,&st);//将文件时间格式转换为系统时间格式(UTC格式),可以看到小时数比真实的小了8
TIME_ZONE_INFORMATION tz;
::GetTimeZoneInformation(&tz);//获取当地时区信息
SYSTEMTIME localST;
::SystemTimeToTzSpecificLocalTime(&tz,&st,&localST);//将UTC时间格式转换为当地时间格式,因为中国是东8区,所以转换时在小时上加了8(本函数转换时自动加的)
printf("最后访问时间为: %d年%d月%d日 %d:%d:%d\n",localST.wYear,localST.wMonth,localST.wDay,localST.wHour,localST.wMinute,localST.wSecond);
}
CloseHandle(hFile);
}
else
{
printf("打开文件失败\n");
}
getchar();
return 0;
}
int main(void)
{
HANDLE hFile = CreateFile(_T("c:\\aa.dat"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
FILETIME createTime;
FILETIME lastAccessTime;
FILETIME lastWriteTime;
if ( INVALID_HANDLE_VALUE != hFile )
{
if ( GetFileTime(hFile,&createTime,&lastAccessTime,&lastWriteTime) )
{
SYSTEMTIME st;
memset(&st,0x0,sizeof(st));
FileTimeToSystemTime(&lastAccessTime,&st);//将文件时间格式转换为系统时间格式(UTC格式),可以看到小时数比真实的小了8
TIME_ZONE_INFORMATION tz;
::GetTimeZoneInformation(&tz);//获取当地时区信息
SYSTEMTIME localST;
::SystemTimeToTzSpecificLocalTime(&tz,&st,&localST);//将UTC时间格式转换为当地时间格式,因为中国是东8区,所以转换时在小时上加了8(本函数转换时自动加的)
printf("最后访问时间为: %d年%d月%d日 %d:%d:%d\n",localST.wYear,localST.wMonth,localST.wDay,localST.wHour,localST.wMinute,localST.wSecond);
}
CloseHandle(hFile);
}
else
{
printf("打开文件失败\n");
}
getchar();
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询