VC++获取文件修改时间?请写代码举例

VC++获取文件修改时间?请写代码举例,第1张

给你看段纯C+SDK代码衡猜吧,是创建时间 你把代码看明白 自己稍微改下就是修改时咐中型间了

先去吧这个结构体类型整明白WIN32_FILE_ATTRIBUTE_DATA

把GetFileAttributesEx这个API弄明白

     case WM_COMMAND:

if(lParam == (LPARAM)hBtn)

{

GetWindowText(hEdit, buf, 1000)

if(!strlen(buf))

{

MessageBox(hwnd, TEXT("文本框为空!"), TEXT("错误"), MB_OK)

}

else

{

WIN32_FILE_ATTRIBUTE_DATA file_attr

FILETIME  LocalFileTime

SYSTEMTIME SysTime

GetFileAttributesEx(buf, GetFileExInfoStandard, (LPVOID)(&file_attr))

FileTimeToLocalFileTime(&file_attr.ftCreationTime, &LocalFileTime)//时间转换msdn上拿来主义copy来的

FileTimeToSystemTime(&LocalFileTime, &SysTime)

sprintf(buf, "Time Generated: %02d-%02d-%02d   %02d:%02d:%02d\n",

SysTime.wYear, SysTime.wMonth, SysTime.wDay, 培历

SysTime.wHour, SysTime.wMinute, SysTime.wSecond)

MessageBox(hwnd, buf, TEXT("文件创建时间为"), MB_OK)

}

}

return 0

通常,文件、文件夹的时间属性指的是创建时间、最近访问时间和最近修改时间等几个具体属性。对于文件的上述属性可以通过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

}

在VC++下对文件属性的获取与更改

摘要:本文讲述了在Visual C++ 下编程实现对磁盘文件的属性进行获取以及更改的一般方法,并给出部告脊分相关的关键代码。

一、 引言

文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创 建、读取和写入文件。对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。 以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需 要对滚碰文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间等等进行提取处理与重新设置。

二、 WIN32_FIND_DATA结构

关于文件的全部属性信息,总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。

在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。该结构的内容如下:

typedef struct _WIN32_FIND_DATA {

DWORD dwFileAttributes//文件属性

FILETIME ftCreationTime// 文件创建时间

FILETIME ftLastAccessTime// 文件最后一次访问时间

FILETIME ftLastWriteTime// 文件最后一次修改时间

DWORD nFileSizeHigh// 文件长度高32位

DWORD nFileSizeLow// 文件长度低32位

DWORD dwReserved0// 系统保留

DWORD dwReserved1// 系统保袜备渗留

TCHAR cFileName[ MAX_PATH ]// 长文件名

TCHAR cAlternateFileName[ 14 ]// 8.3格式文件名

} WIN32_FIND_DATA, *PWIN32_FIND_DATA

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待 *** 作文件的相关属性读取到WIN32_FIND_DATA结构中去:

WIN32_FIND_DATA ffd

HANDLE hFind = FindFirstFile("c:\\test.dat",&ffd)

在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。

三、 文件属性信息的获取与更改

为了更好的保存获取到的文件属性信息,对应于文件属性构造一个自定义的FILE_INFO数据结构,获取的属性信息可暂存于此:

typedef struct _FILE_INFO {

TCHAR szFileTitle[128]//文件的标题名

DWORD dwFileAttributes//文件的属性

FILETIME ftCreationTime//文件的创建时间

FILETIME ftLastAccessTime//文件的最后访问时间

FILETIME ftLastWriteTime//文件的最后修改时间

DWORD nFileSizeHigh//文件大小的高位双字

DWORD nFileSizeLow//文件大小的低位双字

DWORD dwReserved0//保留,为0

DWORD dwReserved1//保留,为0

} FILE_INFO, * PFILE_INFO

首先用FindFirstFile()函数将文件属性获取到WIN32_FIND_DATA 结构对象FindFileData中去,之后可以用FindClose()将其关闭,并把FindFileData中的有关文件属性信息的内容复制到自定 义结构FILE_INFO的结构对象FileInfo中备用。下面是关于这部分描述的部分关键代码:

//声明结构对象

FILE_INFO FileInfo

WIN32_FIND_DATA FindFileData

……

//获取文件属性信息

FindClose(FindFirstFile("Test.txt",&FindFileData))

memset(&FileInfo,0,sizeof(FILE_INFO))

……

//将文件属性信息保存到FileInfo中备用

strcpy(FileInfo.szFileTitle,myFile.GetFileTitle())

FileInfo.dwFileAttributes = FindFileData.dwFileAttributes

FileInfo.ftCreationTime = FindFileData.ftCreationTime

FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime

FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime

FileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh

FileInfo.nFileSizeLow = FindFileData.nFileSizeLow

……

在获取到文件的原始属性信息后既可以原封不动的将属性重新写到文件,也可以对其中某一项或某几项属性内容进行修改后再行写入文件,从而达到更改文件属性 的目的。比如可以用SetFileTime()函数设置文件的创建时间、最近一次访问时间以及最近一次修改的时间等等:

SetFileTime((HANDLE)destFile.m_hFile, //待写入的文件句柄

&FileInfo.ftCreationTime, //文件的创建时间

&FileInfo.ftLastAccessTime, //文件最近一次的访问时间

&FileInfo.ftLastWriteTime)//文件最近一次的修改时间

也可以用SetFileAttributes() 函数实现对文件属性的修改:

SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes)

至于文件名的修改则更加简单,直接在创建文件时在CreateFile()或CFile类的成员函数Open里直接对文件名参数进行设置即可。

文章链接地址:http://blog.csdn.net/lixiaosan/archive/2006/04/07/654219.aspx


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12272095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存