首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载  ┆ 端午节祝福 
设为首页
加入收藏
联系我们
热门关键字: .net应用  操作系统  Dreamweaver  WinRAR  网络推广
高级搜索
您当前的位置: 主页>C/C++>开发工具>实例讲解VC++实现对文件夹时间的修改
实例讲解VC++实现对文件夹时间的修改
来源: 发布时间:2008-07-13 发布人: 浏览: 人次   字体: [ ]  
         在目前的Windows操作系统下,不论是直接通过手工进行数据备份还是通过某些数据备份软件来进行,都难以将这些信息完全保持原貌复制过来,尤其对于每时每刻均在发生变化的时间属性更是难以保持其原始信息。不仅如此,在Windows操作系统下甚至没有提供能直接修改此类属性的工具和手段。为此,笔者对该问题做了研究,并总结出一套比较简单的解决办法。

  设计思路

  在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, //安全属性
  WORD 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 // 最近修改时间的地址 );

  其中后三个参数均是指向FILETIME结构的指针,得到的也都是UTC时间,如果需要,可以通过FileTimeToLocalFileTime()函数将此UTC时间转化成本地时间。而且还可以进一步通过FileTimeToSystemTime()函数将其从文件时间格式转化成系统时间格式,转化后的时间格式将保存在一个SYSTEMTIME结构对象中。类似的,在将时间信息写入到文件夹属性时,如果不是文件时间格式也应当通过SystemTimeToFileTime()函数将其从系统时间格式转换成文件时间格式,然后再通过SetFileTime()函数将指定的时间写入到文件夹的时间属性中去。这样,在进行数据备份和恢复的过程中,包括根目录在内的所有文件夹都可以保持时间属性的一致。

  简单示例

  下面根据前面的讲述而给出一个简单的应用示例,通过此示例可以从指定的文件夹读取时间属性信息并可在经过修改后再回写进去(在此仅对最近修改时间进行处理,对于其他的时间属性可用类似的方法加以实现)。这里通过两个函数GetDirTime()和SetDirTime()来实现对文件夹时间信息的获取与更改处理,下面就以注释的形式对这两个函数的实现过程进行讲解: // 获取指定文件夹的时间属性,入口参数DirName指定了待处理的文件夹,stime为一

  // 指向SYSTEMTIME结构的指针

  BOOL CSetForderTimeDlg::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结构的指针

  BOOL CSetForderTimeDlg::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;

  // 文件夹的创建时间


共2页: 上一页 1 [2] 下一页
↓下一篇:没有了
相 关 文 章   发布商链接
·图解VC2005之创建解决方案祥细步骤
·如何在Tree空件上实现点右健选中Item...
·如何在程序中获得其他程序的图标?
·VC怎样加载其他的应用程序?
·Visual C++编程技巧实用小结14例
·Visual C++开发工具与调试技巧整理
·Visual C++设计超强仿QQ自动伸缩窗口
·在VC6.0下配置boost库使用正则表达式
·VC实现多文件文本替换的解决方案
·在VC中创建DLL文件的方法步骤祥解
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·VC获取目录的两种方法代码
·VC获得当前系统是什么语言版...
·双击VC对话框提示cannot add ...
·VC操作Excel和运用ADO操作数...
·vc6.0实现鼠标显示按钮功能提
·VC++更改系统IP地址的方法代...
·如何消除vc屏幕闪烁的方法?
·在CListView控件添加右键弹出
·MFC中利用CMenu类动态添加弹...
·详解如何在VC++下动态调整水...
·如何在VC++下完全动态生成水...
·C++builder调试时提示找不到b...
·vc实现定时执行任务的两种方...
·VC使用定时机制的几种方法
·VC制作使用图片做为背景的对...
热 门 文 章
·图解VC2005之创建解决方案祥...
·Vc中自定义消息及其触发使用
·在VC中创建DLL文件的方法步骤...
·VC使用定时机制的几种方法
·Visual C++开发工具与调试技...
·MFC中利用CMenu类动态添加弹...
·如何消除vc屏幕闪烁的方法?
·在CListView控件添加右键弹出...
·Visual C++设计超强仿QQ自动...
·VC制作使用图片做为背景的对...
·vc实现定时执行任务的两种方...
·Visual C++编程技巧实用小结1...
·VC++更改系统IP地址的方法代...
·如何在VC++下完全动态生成水...
·VC实现多文件文本替换的解决...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .