龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++实现对文件夹时间的修改

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
VC++实现对文件夹时间的修改 摘要: 本文给出了一种通过VC++程序对文件夹的时间属性信息进行获取与更改的一种方法。 关键词: 文件夹;时间属性;Visual C++ 6.0 引言: 通常在数据维护

  VC++实现对文件夹时间的修改

  摘要: 本文给出了一种通过VC++程序对文件夹的时间属性信息进行获取与更改的一种方法。

  关键词: 文件夹;时间属性;Visual C++ 6.0

  引言:

   通常在数据维护与数据管理等工作中,经常要对各类数据进行备份操作。对于大多数的IT企业和绝大多数的个人用户而言,数据的备份主要是对数据内容的简单 备份,而很少涉及对备份数据自身属性如文件属性、所在文件夹的时间属性等内容的备份。而在某些对数据管理有着非常严格要求的特殊行业中,对以上这些相关属 性信息的备份也是同等重要的。但是在目前的Windows操作系统下,不论是直接通过手工进行数据备份还是通过某些数据备份软件来进行,都难以将这些信息 完全保持原貌复制过来,尤其对于每时每刻均在发生变化的时间属性更是难以保持其原始信息。不仅如此,在Windows操作系统下甚至没有提供能直接修改此 类属性的工具和手段。为此,笔者对该问题做了研究,并总结出一套比较简单的解决办法。其中,对于文件属性的备份与更改方法笔者已在天极网《在VC++下对文件属性的获取与更改》一文做了阐述,因此,本文在此就不再加以赘述,而着重对文件夹时间属性的获取与更改方法进行介绍。

  设计思路

  在Windows操作系统下并没有提供任何可供修改文件夹时间属性的方法和手段,即使是在Win32 API函数中,也只是提供了对文件时间属性进行修改的函数调用,而没有关于文件夹时间属性修改的只言片语。虽然Windows所提供的备份程序能够把待备份文件夹下的所有子文件夹的时间属性按照原样完整的复制过去,但是却无法保持根目录时间属性的恒定。由此,可以考虑采取备份的方式来进行,并从同备份相关的Win32 API函数入手。具体而言,可以先以打开文件的方式来打开文件夹,然后就可以通过原本用于处理文件时间属性的Win32 API函数GetFileTime()和SetFileTime()来获取原始时间属性并以其为参数来设置备份后的文件夹时间属性了,这样的处理可以确保文件夹在备份前后时间属性的一致。

   根据前面的分析可以看出,按照打开文件的方式来打开文件夹是整个处理过程的关键,通常主要用于创建、打开文件的Win32 API函数CreateFile()并非只能用来创建和打开文件对象,实际上它还可以用来创建、打开管道、邮槽、通讯资源、磁盘驱动器(只对 Windows NT而言)、控制台和文件夹(只能打开)等。下面给出CreateFile()的原型:

HANDLE CreateFile(
 LPCTSTR lpFileName, // 文件名指针
 DWORD dwDesiredAccess, // 访问模式
 DWORD dwShareMode, // 共享模式
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性
 DWORD dwCreationDisposition, // 创建方式
 DWORD dwFlagsAndAttributes, // 文件属性
 HANDLE hTemplateFile // 指向待复制属性的文件指针
);

   当用其进行文件夹打开操作时,第一个参数lpFileName应被设置成为待打开的文件夹的名称;至于访问模式可以根据需要灵活设置,对于本文而言,对 源文件夹只进行读取操作故可以设置为GENERIC_READ,对于备份后的文件夹由于需要将属性信息写入,因此需要有GENERIC_WRITE的支 持;共享模式参数dwShareMode的设置与进行文件处理时的设置没有什么区别,在此可以设置为 FILE_SHARE_READ|FILE_SHARE_DELETE;由于CreateFile()函数在进行文件夹操作时,不能以创建方式进行,因此 创建方式只能打开已经存在的对象,即dwCreationDisposition应当设置为OPEN_EXISTING;相比而言, dwFlagsAndAttributes参数的设置是比较重要的,正是通过将该参数设置为FILE_FLAG_BACKUP_SEMANTICS属性才 使CreateFile()函数来进行打开文件夹的操作。

  通常,文件、文件夹的时间属性指的是创建时间、最近访问时间和最近修改时间 等几个具体属性。对于文件的上述属性可以通过GetFileTime()来获取,对于文件夹,在通过CreateFile()函数将其打开后,其获取得到 的句柄可以当作文件句柄来使用。因此,通过GetFileTime()函数同样也可以得到文件夹的时间属性。GetFileTime()函数原型如下:

BOOL GetFileTime(
 HANDLE hFile, // 文件句柄
 LPFILETIME lpCreationTime, // 创建时间的地址
 LPFILETIME lpLastAccessTime, // 最近访问时间的地址
 LPFILETIME lpLastWriteTime // 最近修改时间的地址
);

精彩图集

赞助商链接