VC编程改变指定的文件或文件夹的属性
来源:互联网 发布:图标是猫编程软件下载 编辑:程序博客网 时间:2024/05/26 02:53
本实例基于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 );
该函数在指定目录寻找与指定文件名匹配的文件和文件夹,并返回一个查询句柄。
例子:WIN32_FIND_DATA FindFileData;
FindClose(FindFirstFile("1.doc", &FindFileData));
BOOL FindNextFile( HANDLE,LPWIN32_FIND_DATA );
该函数继续一个由查询句柄指定的查询过程。
例子:同FindFirstFile相似
BOOL FindClose( HANDLE );
该函数关闭指定的查询句柄,结束指定的查询。
DWORD GetFileAttributes( LPCTSTR );
该函数检取指定的文件的属性信息。
BOOL SetFileAttributes( LPCTSTR,DWORD );
该函数设置指定的文件的属性信息。
例子:SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);其中变量的定义见下面的程序代码
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 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、添加代码,编译运行程序。
三、程序代码
void CFileDlg::OnTest()
{
myFile.Open("1.doc", CFile::modeReadWrite);
destFile.Open("2.doc", CFile::modeReadWrite);
//声明结构对象
FILE_INFO FileInfo;
WIN32_FIND_DATA FindFileData;
//获取文件属性信息
FindClose(FindFirstFile("1.doc", &FindFileData));
memset(&FileInfo,0,sizeof(FILE_INFO));
//将文件属性信息保存到FileInfo中备用
strcpy(FileInfo.szFileTitle, destFile.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( (HANDLE)destFile.m_hFile, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime ); //文件最近一次的修改时间
SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);
myFile.Close();
destFile.Close();
}
四、小结
本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。用此技术可以在通讯等对文件有严格要求的应用领域实现文件或文件夹的全部信息(包括文件内容、文件名以及文件属性等)的完整传送。
- VC编程改变指定的文件或文件夹的属性
- VC编程改变指定的文件或文件夹的属性
- VC MFC 显示文件或文件夹的属性
- 用Visual C++实现改变指定的文件和文件夹的属性
- 选中指定的文件或文件夹
- 打开指定的文件夹或文件
- 显示文件或文件夹的属性
- python返回指定目录下指定的文件或文件夹
- VC得到指定文件的详细信息/属性
- 关于改变一个文件夹下的所有文件的属性
- 打开一个指定的文件夹并选中里面的一个指定文件或文件夹
- vc 复制和删除指定的文件和文件夹
- vc 复制和删除指定的文件和文件夹
- 利用系统钩子技术隐藏指定的文件或文件夹
- 用VBA判断指定的文件夹或文件是否存在
- VBA判断指定的文件夹或文件是否存在
- 查找指定目录下的文件夹或文件
- Forfiles命令删除指定天数以前的文件或文件夹
- 谈文化现象思考(主管总是谈文化)
- 二十多年的程序开发之路: 感受篇-----(袁峰)
- JBuilder
- 接入路由器做NAT,做限速的一些想法
- sql server2000的BCP的使用技巧
- VC编程改变指定的文件或文件夹的属性
- Windows 2003下VPN服务器架设攻略
- 用Sniffer和ARP分析网络问题
- 微软推出Live Local 能从街道看清人脸
- DOS批处理全面教程
- 从我们班的校友录上copy过来的。
- 回味陈年老酒----DOS
- C语言上机练习常见问题
- Symantec Ghost在机房管理中的应用