龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
---- 2、在对话类中加入以下成员: char filter[16]; int ChangeTheProperty(LPSTR Filename,BYTE bFlag=0) ; 其中成员变量filter用以存放带通配符的文件名。 成员函数ChangeTh

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

精彩图集

赞助商链接