VC++实现文件夹时间属性的获取与更改

引言:

对于大多数的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 // 最近修改时间的地址
);

 

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

时间: 2024-09-10 20:47:11

VC++实现文件夹时间属性的获取与更改的相关文章

win8无法更改文件夹的属性,只读去不掉

问题描述 win8无法更改文件夹的属性,只读去不掉 win8文件夹的只读属性无法去除,试了好多种方法,修改之后,再次进入还是只读,甚至命令行都用了:attrib -r myfolder都不行 解决方案 使用管理员的身份修改. 解决方案二: 用系统工具盘上的pe系统进去修改下看看

文件夹右键属性与双击打开的属性不一样怎么办?

  今天在统计信息的时侯,发现了右键文件夹属性与直接打开文件夹统计数据不一致.现将原因分离给大家. 1.右键我统计的文件夹,右键属性,统计数据为:122. 2.打开文件夹,分别统计为:115个. 3.原因是为什么呢?首页,我们看看有没有隐藏文件.这样可能导致我们没有发现的文件而统计数减少.工具,文件夹选项,查看,显示隐藏的文件.文件夹和驱动器. 4.检查发现,没有隐藏文件.第二个原因,查看隐藏受保护的操作系统文件(推荐)去掉选中的勾选. 5.此时发现出现了文件.找到了少掉的7个文件.

VC遍历文件夹下所有文件和文件夹

find(char * lpPath) { char szFind[MAX_PATH]; WIN32_FIND_DATA FindFileData; strcpy(szFind,lpPath); strcat(szFind,"*.*"); HANDLE hFind=::FindFirstFile(szFind,&FindFileData); if(INVALID_HANDLE_VALUE == hFind) return; while(TRUE) { if(FindFileDa

ASP FSO设置/读取文件(夹)属性详解

例  代码如下 复制代码 <HTML> <HEAD><TITLE>获取文件属性代码</TITLE></HEAD> <BODY> <% '创建一个FileSystemObject对象的事例 Set MyFileObject=Server.CreateObject("Scripting.FileSystemObject") '创建一个File对象的事例 filename=server.mappath("

JS获取本地文件夹的文件列表

一.功能实现核心:FileSystemObject 对象 要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对象. 二.FileSystemObject编程 使用FileSystemObject 对象进行编程很简单,一般要经过如下的步骤: 创建FileSystemObject对象.应用相关方法.访问对象相关属性 . (一)创建FileSystemObject对象 创建FileSystemObject对象的 代码只要1行: var fso = new Acti

XP文件夹属性没有“安全”选项卡

1. 文件夹所在的盘必须是必须是NTFS分区才能有"安全"选项卡,FAT32的不可以,转换方法在开始菜单-运行,输入"Convert x: /fs:ntfs"然后回车. x为要转换的驱动器号,如c d e 1-1.打开工具->文件夹选项->查看->把使用简单的文件夹共享那个勾去掉.就可以了. 1-2.开始--设置--控制面板--管理工具--本地安全策略 点击其中的本地策略--安全选项.找到其中的"网络访问:本地账户的共享和安全模式&quo

asp.net C# 获取指定文件夹下所有子目录及文件(目录数与文件数)

  int j = 0; protected void button1_click(object sender, eventargs e) { directoryinfo dir = new directoryinfo(textbox1.text.tostring()); label1.text = getallfiles(dir).tostring(); }getallfiles方法为自定义方法,实现遍历整个文件夹文件的方法.代码如下: public int getallfiles(direc

VC++ 使用 _access函数判断文件或文件夹是否存在_C 语言

_access函数 int _access( const char *path, int mode ); int _waccess( const wchar_t *path, int mode ); 参数 path 文件或目录路径. mode 读/写特性. 返回值   如果文件包含特定模式,每个函数返回 0. 函数返回 - 1,则名称文件不存在或不具有特定模式:在这种情况下,如下表errno 所示设置. EACCES 访问被拒绝:文件权限的设置不允许指定的访问权限. ENOENT 未找到文件名或

php如何获取文件夹名字

php如何获取文件夹名字 php如何获取文件夹名字其实很简单,只要记住一两个函数就可以了! $dir = "message/";  // 文件夹的名称 if (is_dir($dir)){     if ($dh = opendir($dir)){         while (($file = readdir($dh)) !== false){             echo "文件名: $file <br>";         }