科技时代新浪首页 > 科技时代 > 学园 > 正文

VC编程改变指定的文件或文件夹的属性


http://www.sina.com.cn 2006年01月18日 07:38 天极yesky
    文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创建、读取和写入文件。对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件的读写、文件的隐现等等进行提取处理与重新设置。例如,修改文件的读写隐现等属性,可以实现文件的保护和控制,尤其是修改文件的产生修改和访问时间,可以避免因防病毒更改系统时间而造成的文件修改时间的紊乱所形成的不便。在DOS下文件的属性可以用DOS命令加以修改,在WINDOWS下,可以通过右键的属性改变一组文件和文件夹的读写属性,但是却不能修改文件的产生修改和访问时间,并且不能修改子目录下的文件和文件夹的属性。

  本实例基于Windows的API,设计了通用的文件和文件夹的属性(包括文件的产生修改和访问时间以及读写隐现等)的修改方法,并实现了其Visual C++程序编码。程序运行后,点击"修改属性"按钮,就可以将项目文件夹中的"2.doc"文档的属性修改的与"1.doc"文档一致。   
  一、实现方法

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

  Windows中的API函数组提供了用于文件读写、属性设置的众多API函数,例如:

HANDLE CreateFile( LPCTSTR, DWORD, DWORD,LPSECURITY_ATTRIBUTES, DWORD,DWORD,HANDLE );

  该函数产生或者打开一个系统对象,并返回一个用以访问该对象的句柄,这些对象可以是文件、文件夹、管道等。

HANDLE FindFirstFile( LPCTSTR, LPWIN32_FIND_DATA );

  该函数在指定目录寻找与指定文件名匹配的文件和文件夹,并返回一个查询句柄。

BOOL FindNextFile( HANDLE,LPWIN32_FIND_DATA );

  该函数继续一个由查询句柄指定的查询过程。

BOOL FindClose( HANDLE );

  该函数关闭指定的查询句柄,结束指定的查询。

DWORD GetFileAttributes( LPCTSTR );

  该函数检取指定的文件的属性信息。 

BOOL SetFileAttributes( LPCTSTR,DWORD );

  该函数设置指定的文件的属性信息。

  Windows中的API函数组提供了有关时间转换的众多API函数,例如:

BOOL SystemTimeToFileTime( CONST SYSTEMTIME *,LPFILETIME );

  该函数将系统时间转换成文件时间,文件时间是一个64位长度的数,表示从1601年1月1日起的时间偏移,以千万分之一秒为单位。  

BOOL LocalFileTimeToFileTime(CONST FILETIME *,LPFILETIME );  

  该函数将本时区的文件时间转换成格林威治时间的文件时间。 

BOOL SetFileTime( HANDLE,CONST FILETIME*,CONST FILETIME *,CONST FILETIME * );

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

  在上面的函数中,FindFirstFile()和FindNextFile()使用的一个数据结构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);


  二、编程步骤

  1、启动Visual C++6.0,生成一个基于对话框的应用程序,命名为"File";

  2、修改对话框界面,在其上放置一个按钮控件,Caption设置为"修改属性",然后使用Class Wizard为该按钮添加鼠标单击消息响应函数;

  3、在项目文件夹中放置"1.doc"、"2.doc"文件;

  4、添加代码,编译运行程序。

 [1] [2] [下一页]

发表评论

爱问(iAsk.com)



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2006 SINA Inc. All Rights Reserved

版权所有 新浪网