⼀、 引⾔
⽂件是数据在磁盘上最常⽤的⼀种存放形式,也是在程序设计中与之经常打交道的⼀种编程对象,不少程序尤其是数据传输和处理类的应⽤程序更是需要频繁的创建、读取和写⼊⽂件。对于⼀些要求不是很严格的程序,我们往往只关⼼⽂件的内容是否正确、⽂件⼤⼩是否有增减或是再严格⼀些,看⽂件名是否符合规定等等。以上这些要素对于⼤多数程序⽽⾔显然是可以满⾜实际需求的,但对于某些特殊⾏业的⼀些有着⽐较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对⽂件的所有属性诸如⽂件的创建时间、⽂件的最后访问时间、⽂件的最后修改时间等等进⾏提取处理与重新设置。
⼆、 WIN32_FIND_DATA结构
⼆、 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: est.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("",&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⾥直接对⽂件名参数进⾏设置即可。
⼩结:本⽂通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘⽂件的相关属性信 ⼩结:
息的获取与修改。⽤此技术可以在通讯等对⽂件有严格要求的应⽤领域实现⽂件全部信息(包括⽂件内容、⽂件名以及⽂件属性等)的完整传送。本⽂所述程序在Windows 98下由Microsoft Visual C++ 6.0编译调试通过。
[@more@]
发布评论