用Visual C++实现改变指定的文件和文件夹的属性

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

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

 

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

 

---- 1API中的文件函数组提供了文件读写、属性设置的众多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 );

该函数设置指定的文件的属性信息。

 

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

BOOL SystemTimeToFileTime( CONST SYSTEMTIME *,LPFILETIME  );

该函数将系统时间转换成文件时间,文件时间是一个64位长度的数,

表示从160111日起的时间偏移,以千万分之一秒为单位。

BOOL LocalFileTimeToFileTime(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);

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

       fileinfodwFileAttributes成员

       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编译,效果良好,符合预期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Visual C 2005、2008和2010是Microsoft开发的编程语言软件,它们分别对应着Visual Studio 2005、2008和2010版本的软件开发工具。这三个版本的Visual C++都包含了一系列运行库文件。 其中,Visual C++ 2005运行库包括了一个MFC(Microsoft Foundation Classes)应用程序所需的所有DLL(动态链接库)文件和一些其他依赖项。这些运行库文件包括MFC、ATL(Active Template Library)、CRT(C运行库)、OpenMP(开放多处理)、STL(标准模板库)等等。它们的作用分别是提供一个面向对象的程序框架、创建快速的C++代码、提供标准的C++函数库支持、并行处理程序以及提供映射到STL的标准C++模板的实现。此外,Visual C++ 2005还提供了可以作为Windows操作系统API的一部分的MFC类。 Visual C++ 2008运行库是Visual C++ 2005运行库的更新版本,它包含了更多的MFC类、增强的ATL和CRT库,并支持新的C++11标准。这使得Visual C++ 2008应用程序执行速度更快、更稳定,并且更易于创建。 最后,Visual C++ 2010运行库包含了跨平台的C++应用程序所需的Windows运行库文件。这个版本的运行库在Windows 7、Windows 8和Windows Server 2008 R2等操作系统上运行更加稳定,用于创建可移植的C++应用程序也更加便捷。 总之,Visual C++ 2005、2008和2010运行库文件为Windows操作系统和跨平台应用程序提供了必要的支持,帮助开发人员快速构建可靠、稳定、高效的应用程序。 ### 回答2: Visual C是一个Windows操作系统下的集成开发环境(IDE),主要用于开发Windows平台下的软件项目。在编写使用Visual C编写的实际应用程序时,必须使用Microsoft Visual C++运行库文件来使得程序在不同的电脑上能够正常运行。 Visual C++ 2005、2008和2010都包含各自版本的运行库文件。虽然这些版本之间的运行库文件有一些不同,但其目的是相同的,即提供某些功能,如内存管理、多线程、网络连接、I/O操作等,以便应用程序正常运行。然而,这些运行库文件在不同的操作系统版本上可能会有不同的要求。 以Visual C++ 2010为例,它提供了三种运行库文件的选择: 1.多线程调试DLL运行库(/MDd) 2.多线程DLL运行库(/MD) 3.多线程静态库(/MT) 这三种选项的区别在于每个选项对应的运行库文件是“动态链接库”(DLL)或“静态链接库”(LIB),以及每个选项与在应用程序中包含运行库文件的方式有关。运行库文件是为了提高代码的复用性而产生的,而库文件的链接方式可以影响应用程序的性能、安全和可靠性。 总之,Visual C++中的运行库文件是不可或缺的,它们为开发者提供了许多便利,并可以使得开发的应用程序在各种平台和操作系统上都能正常运行。真的需要开发者注意的是,在不同的版本和选项中,运行库文件可能是不同的,所以必须要匹配运行库和应用程序的开发环境和目标操作系统。 ### 回答3: Visual C++ 2005、2008和2010是微软公司推出的一系列编程工具,其中包括了一些常用的运行库文件,以便开发者在编写软件时能够使用这些库文件简化程序的开发和部署。 这些运行库文件是针对不同版本的Visual C++开发工具进行的开发,具有相应版本的依赖性,因此在安装和使用这些库文件时需要选择对应版本,否则可能会导致程序无法正常运行或者出现其他问题。 Visual C++ 2005运行库文件包括Microsoft Visual C++ 2005 Redistributable Package (x86)和Microsoft Visual C++ 2005 Redistributable Package (x64),它们对应32位和64位操作系统。这些库文件提供了在使用Visual C++ 2005开发的应用程序运行所需的一些公共组件和标准运行时库。 Visual C++ 2008运行库文件包括Microsoft Visual C++ 2008 Redistributable Package (x86)和Microsoft Visual C++ 2008 Redistributable Package (x64),同样对应32位和64位操作系统。这些库文件为使用Visual C++ 2008开发的应用程序提供了一些常见组件和运行时库。 Visual C++ 2010运行库文件包括Microsoft Visual C++ 2010 Redistributable Package (x86)和Microsoft Visual C++ 2010 Redistributable Package (x64),也含有32位和64位版本。它们提供了在使用Visual C++ 2010开发的应用程序所需要的一些公共组件和运行时库。 总的来说,Visual C++ 2005、2008和2010运行库文件是为开发者提供方便的工具,可以让他们轻松地编写和部署应用程序。同时,这些库文件也为普通的计算机用户提供了便利,让他们在运行软件时无需考虑太多关于运行时库的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值