新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → VC编程改变指定的文件或文件夹的属性 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4359 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: VC编程改变指定的文件或文件夹的属性 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客楼主
    发贴心情 VC编程改变指定的文件或文件夹的属性

    文件是数据在磁盘上最常用的一种存放形式,也是在程序设计中与之经常打交道的一种编程对象,不少程序尤其是数据传输和处理类的应用程序更是需要频繁的创建、读取和写入文件。对于一些要求不是很严格的程序,我们往往只关心文件的内容是否正确、文件大小是否有增减或是再严格一些,看文件名是否符合规定等等。以上这些要素对于大多数程序而言显然是可以满足实际需求的,但对于某些特殊行业的一些有着比较严格要求的软件系统,仅有以上要素还是远远不够的,往往还需要对文件的所有属性诸如文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件的读写、文件的隐现等等进行提取处理与重新设置。例如,修改文件的读写隐现等属性,可以实现文件的保护和控制,尤其是修改文件的产生修改和访问时间,可以避免因防病毒更改系统时间而造成的文件修改时间的紊乱所形成的不便。在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、添加代码,编译运行程序。

    三、程序代码

    /////////////////////////////////////
    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, 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((HANDLE)destFile.m_hFile, //待写入的文件句柄
    &FileInfo.ftCreationTime, //文件的创建时间
    &FileInfo.ftLastAccessTime, //文件最近一次的访问时间
    &FileInfo.ftLastWriteTime); //文件最近一次的修改时间
    SetFileAttributes(FileInfo.szFileTitle,FileInfo.dwFileAttributes);
    myFile.Close();
    destFile.Close();
    }

      四、小结

      本文通过对WIN32_FIND_DATA结构和SetFileTime()、SetFileAttributes()等主要函数实现了对磁盘文件的相关属性信息的获取与修改。用此技术可以在通讯等对文件有严格要求的应用领域实现文件或文件夹的全部信息(包括文件内容、文件名以及文件属性等)的完整传送。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/9/15 15:57:00
     
     GoogleAdSense射手座1984-11-30
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 4:46:28

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms