• 网络学院
  • 新手学堂
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
改变指定的文件和文件夹的属性
广告位
  站点:
  • 首 页
  • 最新软件
  • 最新文章
  • 国内软件
  • 国外软件
  • 汉化软件
  • 源码下载
  • 字体下载
改变指定的文件和文件夹的属性
软件发布 改变指定的文件和文件夹的属性
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回首页 | 文章首页 | 编程技术 | VC教程 | 改变指定的文件和文件夹的属性

改变指定的文件和文件夹的属性

 

添加时间: 2006-2-13 8:51:13  作者: VC教程  阅读次数:835   来源: http://d9soft.com

 

 

        摘要: 文件的属性包括文件的产生修改和访问时间以及读写隐现等,在DOS下文件的属性可以用DOS命令加以修改,在WINDOWS下,可以通过右键的属性改变一组文件和文件夹的读写属性,但是却不能修改文件的产生修改和访问时间,并且不能修改子目录下的文件和文件夹的属性。本文基于Windows的API设计了通用的文件和文件夹的属性(包括文件的产生修改和访问时间以及读写隐现等)的修改方法,并实现了其Visual C++程序编码。

  ---- 文件的属性的修改具有广泛的使用价值,修改文件的读写隐现等属性,可以实现文件的保护和控制,尤其是修改文件的产生修改和访问时间,可以避免因防病毒更改系统时间而造成的文件修改时间的紊乱所形成的不便,例如,对程序员来说,编译时,系统有可能又重新编译那些修改时间紊乱的文件,造成不必要的麻烦。   

  ---- 一、应用的API函数   

  ---- 1、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 );

  该函数设置指定的

  文件的属性信息。  

  ---- 2、API中的时间函数组提供了有关时间转换的众多API函数,在本编码中用到的该函数组中的函数有:

  BOOL SystemTimeToFileTime

  ( CONST SYSTEMTIME *,LPFILETIME );

  该函数将系统时间转换成文件时间,

  文件时间是一个64位长度的数,

  表示从1601年

  1月1日起的时间偏移,

  以千万分之一秒为单位。

  BOOL LocalFileTime

  ToFileTime(

  CONST FILETIME *,LPFILETIME );

  该函数将本时区的

  文件时间转换成格林威治

  时间的文件时间。

  BOOL SetFileTime

  ( HANDLE,CONST FILETIME

  *,CONST FILETIME *,

  CONST FILETIME * );

  该函数设置文件产

  生修改和访问的时间。  

  ---- 二、编码实现

  ---- 1、首先建立一个基于对话框的工程,在对话框窗体中放置以下控制并通过类管理向导为这些控制添加适当变量:   

  文件名编辑框,输入要改变的文件的全路径,文件名中可以有通配符*和?。

  变量类型CString,名称m_FILENAME;

  修改包括子目录文件的检查框,变量类型BOOL,名称m_DIRECTORY;

  修改文件访问时间检查框,变量类型BOOL,名称m_ACCESS;

  文件访问时间日编辑框,变量类型BOOL,名称m_ADAY;

  文件访问时间月编辑框,变量类型BOOL,名称m_AMONTH;

  文件访问时间年编辑框,变量类型BOOL,名称m_AYEAR;

  修改文件产生时间检查框,变量类型BOOL,名称m_CREATE;

  文件产生时间日编辑框,变量类型BOOL,名称m_CDAY;

  文件产生时间时编辑框,变量类型BOOL,名称m_CHOUR;

  文件产生时间分编辑框,变量类型BOOL,名称m_CMINUTE;

  文件产生时间月编辑框,变量类型BOOL,名称m_CMONTH;

  文件产生时间秒编辑框,变量类型BOOL,名称m_CSECOND;

  文件产生时间年编辑框,变量类型BOOL,名称m_CYEAR;

  修改文件修改时间检查框,变量类型BOOL,名称m_MODIFY;

  文件修改时间日编辑框,变量类型BOOL,名称m_MDAY;

  文件修改时间时编辑框,变量类型BOOL,名称m_MHOUR;

  文件修改时间分编辑框,变量类型BOOL,名称m_MMINUTE;

  文件修改时间月编辑框,变量类型BOOL,名称m_MMONTH;

  文件修改时间秒编辑框,变量类型BOOL,名称m_MSECOND;

  文件修改时间年编辑框,变量类型BOOL,名称m_MYEAR;

  修改文件属性检查框,变量类型BOOL,名称m_PROPERTY;

  文件隐藏属性检查框,变量类型BOOL,名称m_HIDE;

  文件只读属性检查框,变量类型BOOL,名称m_READ;

  文件存档属性检查框,变量类型BOOL,名称m_SAVE;

  文件系统属性检查框,变量类型BOOL,名称m_SYSTEM;

  执行更改的按钮,点击该按钮后执行选定的更改操作。

  以上成员变量可在对话类的构造函数中用当前系统时间予以初始化。  

  ---- 2、在对话类中加入以下成员:

  char filter[16];

  int ChangeTheProperty

  (LPSTR Filename,BYTE bFlag=0) ;

  其中成员变量filter用以存放带通配符的文件名。

  成员函数ChangeTheProperty中实

  现了带通配符的文件的属性的改变,考虑到要遍历子目录,

  该函数采用了递归调用,并请注意参数bFlag,其缺省值为0,

  1表示调用发生自子目录。其实现如下:

  int CChangePropertyDlg::Change
  TheProperty(LPSTR FileName,BYTE bFlag)

  {

  ////存放路径

  char pathname[MAX_PATH];

  ////存放全路径文件名

  char allname[MAX_PATH];

  ////初始化pathname

  int num=strlen(FileName);
    for(int i=num-1;i>=0;i--){
    if(FileName[i]=='\\')
    break;
    }

    if(i==-1)
    return 0;
    strncpy(pathname,FileName,i+1);
    pathname[i+1]='\0';

    ////查找并修改所有子目录下符合条件的文件

    DWORD stat=0;
    WIN32_FIND_DATA fileinfo;
    if(bFlag){
    char DFileName[MAX_PATH];
    strcpy(DFileName,pathname);
    strcat(DFileName,"*.*");
    HANDLE handle=FindFirstFile
    (DFileName, &fileinfo);
    if(handle==INVALID_HANDLE_VALUE)

    return 0;

    do{
    if(fileinfo.cFileName[0]=='.')
    continue;
    strcpy(allname,pathname);
    strcat(allname,fileinfo.cFileName);

    //检取文件属性,可以使用

    fileinfo的dwFileAttributes成员
    stat=GetFileAttributes(allname);
    if(stat==0xffffffff){
    MessageBox("警告,获取文件信息时出错!!",
    allname, MB_OK MB_ICONINFORMATION);
    continue;
    }

  //如果查询到的是文件夹

  if(stat&FILE_ATTRIBUTE_
    DIRECTORY && m_DIRECTORY){
    char temp[MAX_PATH];
    sprintf(temp,"%s%s\\%s",
    pathname,
    fileinfo.cFileName,filter);

  //递归改变该子目录下的文件

    ChangeTheProperty(temp,1);
    }
    }while(FindNextFile
    (handle, &fileinfo));
    FindClose(handle);
    }
 ////查找并修改符合条件的文件和文件夹

    HANDLE handle=FindFirstFile
    ( FileName, &fileinfo );
    if(handle==INVALID_HANDLE_VALUE)
    return 0;
    do{
    if(fileinfo.cFileName[0]=='.')
    continue;
    strcpy(allname,pathname);
    strcat(allname,fileinfo.cFileName);

  //检取文件属性

  stat=GetFileAttributes(allname);
    if(stat==0xffffffff){
    MessageBox("警告,获取文件信息时出 错!!",
    allname,MB_OK MB_
    ICONINFORMATION);
    continue;
    }

  //设置文件属性

  BOOL tt=SetFileAttributes(allname,0);
    if(!tt){
    MessageBox("警告,文件信息出错!!",
    allname,MB_OK MB_
    ICONINFORMATION);
    continue;
    }

  HANDLE hd=CreateFile(allname,
    GENERIC_WRITE, FILE_SHARE_WRITE,
    NULL,OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS,NULL);
    if(hd!=INVALID_HANDLE_VALUE){
    SYSTEMTIME st[3];
    GetLocalTime(&st[0]);
    st[1]=st[0];st[2]=st[0];
    FILETIME ft[3];
    FILETIME lft[3];
    BYTE ff[3];
    ff[0]=0;ff[1]=0;ff[2]=0;

  //改变文件访问时间

  if(m_ACCESS){
    ff[0]=1;
    st[0].wDay =m_ADAY;st[0].
    wMonth=m_AMONTH;
    st[0].wYear=m_AYEAR;
    BOOL bb=SystemTime
    ToFileTime(&st[0],&ft[0]);
    bb=LocalFileTime
    oFileTime(&ft[0],&lft[0]);
    }

  //改变文件产生时间

  if(m_CREATE){
    ff[1]=1;
    st[1].wDay=m_CDAY;st[1].
    wHour=m_CHOUR;st[1].
    wMinute=m_CMINUTE;
    st[1].wMonth=m_
    CMONTH;st[1].
    wSecond=m_CSECOND;
    st[1].wYear=m_CYEAR;
    BOOL bb=SystemTime
    ToFileTime(&st[1],&ft[1]);
    bb=LocalFileTime
    ToFileTime(&ft[1],&lft[1]);
    }

  //改变文件修改时间

  if(m_MODIFY){
    ff[2]=1;
    st[2].wDay=m_MDAY;st[2].
    wHour=m_MHOUR;st[2].
    wMinute=m_MMINUTE;
    st[2].wMonth=m_MMONTH
    ;st[2].
    wSecond=m_MSECOND;
    st[2].wYear=m_MYEAR;
    BOOL bb=System
    TimeToFileTime(&st[2],&ft[2]);
    bb=LocalFileTime
    ToFileTime(&ft[2],&lft[2]);
    }

  //改变文件时间

  BOOL tt=SetFile
    Time(hd,ff[1]?&lft[1]:
    NULL,ff[0]?&lft[0]:
    NULL,ff[2]?&lft[2]:NULL);
    if(!tt){
    MessageBox("警告,文件信息出错!!",
    allname,MB_OK MB_ICONINFORMATION);
    }
    CloseHandle(hd);
    }

  //改变文件属性

  if(m_PROPERTY){
    if(m_HIDE)
    stat =FILE_
    ATTRIBUTE_HIDDEN;
    else
  stat&=~FILE_
    ATTRIBUTE_HIDDEN;
    if(m_READ)
    stat =FILE_
    ATTRIBUTE_READONLY;

  else

    stat&=~FILE_
    ATTRIBUTE_READONLY;
    if(m_SAVE)
    stat =FILE_
    ATTRIBUTE_ARCHIVE;

  else

  stat&=~FILE_
    ATTRIBUTE_ARCHIVE;
    if(m_SYSTEM)
    stat =FILE_
    ATTRIBUTE_SYSTEM;

  else

  stat&=~FILE_
    ATTRIBUTE_SYSTEM;
  }

  //设置文件属性

  tt=SetFileAttributes(allname,stat);
    if(!tt){
    MessageBox("警告,文件信息出错!!",allname,
    MB_OK MB_
    ICONINFORMATION);
    continue;
  }

  //查找并修改当前目录

  下所有符合条件的文件

  if(stat&FILE_
    ATTRIBUTE_DIRECTORY
    && !bFlag){//m_DIRECTORY
    char temp[128];
    sprintf(temp,"%s%s\\%s",
    pathname,fileinfo.cFileName,filter);

  //递归改变该子目录下的文件

  ChangeTheProperty(temp,1);
    continue;
    }
    }while(FindNextFile( handle, &fileinfo ));
    FindClose(handle);
    return 1;
    }  

  ---- 3、在执行更改的按钮的BN_CLICKED消息处理器中加入以下代码,这段代码首先解析了输入的文件名全路径,并初始化了filter成员变量:

  UpdateData(TRUE);

    int num=m_FILENAME.GetLength();

    for(int i=num-1;i>=0;i--){
    if(m_FILENAME.GetAt(i)=='\\')
    break;
    }

    if(i!=-1){
    CString ss=m_FILENAME.Right( num-1-i );
    strcpy(filter,ss.GetBuffer(15) );
    ss.ReleaseBuffer();
    ChangeTheProperty
    ( m_FILENAME.GetBuffer(128)) ;
    m_FILENAME.ReleaseBuffer();
    }

  ---- 4、编译连接后,在文件名编辑框中输入要改变的文件的带通配符的全路径,设置文件的创建修改访问时间以及只读隐藏等属性,点击该按钮后执行选定的更改操作。

  ---- 三、本编码在NT4.0平台,用VC++6.0编译,效果良好,符合预期。

 

 

 

上下文章:

 

上一篇文章: VC遍历整个目录树查找文件 下一篇文章: ADO在VC++中进行数据库编程

相关文章:

  • 卑鄙病毒:加密你的文件勒索你的钱
  • 端午节忠告:要警惕FLASH祝福文件里的包藏祸心
  • Oracle联机日志文件丢失处理方法
  • servlet实现oracle中读出文件并显示
  • ORACLE控制文件的重建

相关软件:

  • 木马文件粉碎机 V3.0
  • 超级秘密文件夹 5.81
  • PE文件加区器 1.0
  • 文件备份专家 V2.55
  • 文件夹看门狗 V3.5 白金版
  • 文件批量更名大师 V3.26

 

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • 深入编程:控制面板知多少?
  • VC++之Scroll Bar

编程技术阅读总排行

  • VB入门教程之一
  • 第二章 PowerBuilder 入门之创建新...
  • Java连接数据库实例
  • 第一章 什么是PowerBuilder
  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有