用Visual C++实现改变指定的文件和文件夹的属性(3)
---- 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中用GDI函数实规高速平滑动画
- 下一篇:在VC++6.0开发中实现全屏显示

