void __fastcall TForm1::RenameFiles(int flag)
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*",faAnyFile,sr)==0)
{
do
{
if((sr.Attr&faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
//如是子目录(不包括.和..子目录)
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
else if((sr.Name!=".")&&(sr.Name!=".."))
{
if(flag==1)
{
// ShowMessage(sr.Name);
RenameFile(sr.Name,sr.Name+".eee"); //文件改名,加上.eee后缀
}
else
{
if(AnsiString(sr.Name).SubString(AnsiString(sr.Name).Length()-3,4).UpperCase()==".eee")
{
DestName=AnsiString(sr.Name).Delete(AnsiString(sr.Name).Length()-3,4);
}
RenameFile(sr.Name,DestName); //文件改名,去除.eee后缀
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
32 个解决方案
#1
如能解决问题,我另开贴子再赠送100分。
#2
将你的程序变成流程图,然后走一遍就可以了发现问题了。
我做了一个,但是只是完成某个文件夹下面的文件的批量改名(当然,视文件数量的多少,后面加上位数做标识)的。
我做了一个,但是只是完成某个文件夹下面的文件的批量改名(当然,视文件数量的多少,后面加上位数做标识)的。
#3
TO: BlueCapricorn(摩羯)
能不能将你的源码贴出来啊?谢谢!
能不能将你的源码贴出来啊?谢谢!
#4
BlueCapricorn(摩羯)
请教,你说的“将你的程序变成流程图”是C++BUILDER 有这样的功能还是有其他软件能办到?
puma66 (飞马)
RenameFile(sr.Name,sr.Name+".eee"); //文件改名,加上.eee后缀
在这里先检查一下,如果后缀名已经是.eee了,就不要改。
请教,你说的“将你的程序变成流程图”是C++BUILDER 有这样的功能还是有其他软件能办到?
puma66 (飞马)
RenameFile(sr.Name,sr.Name+".eee"); //文件改名,加上.eee后缀
在这里先检查一下,如果后缀名已经是.eee了,就不要改。
#5
改了一下,楼主试试
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
void __fastcall TForm1::RenameFiles(int flag)
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*", faAnyFile,sr)==0)
{
do
{
if (sr.Attr&faDirectory)
//如是子目录(不包括.和..子目录)
{
if ((sr.Name != ".") && (sr.Name != ".."))
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
}
else
{
if (flag==1)
{
// ShowMessage(sr.Name);
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(StrRight(sr.Name, 4).LowerCase()==".eee")
RenameFile(sr.Name, LeftStr(sr.Name, Length(sr.Name) - 4)); //文件改名,去除.eee后缀
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
void __fastcall TForm1::RenameFiles(int flag)
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*", faAnyFile,sr)==0)
{
do
{
if (sr.Attr&faDirectory)
//如是子目录(不包括.和..子目录)
{
if ((sr.Name != ".") && (sr.Name != ".."))
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
}
else
{
if (flag==1)
{
// ShowMessage(sr.Name);
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(StrRight(sr.Name, 4).LowerCase()==".eee")
RenameFile(sr.Name, LeftStr(sr.Name, Length(sr.Name) - 4)); //文件改名,去除.eee后缀
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
#6
和查看目录下的文件思路应该一样
用递归是正确的
用递归是正确的
#7
TO:shadowstar(天作棋盘星作子,谁人敢下?)
编译时说StrRight没定义,是不是要加什么头文件?
编译时说StrRight没定义,是不是要加什么头文件?
#8
void __fastcall TForm1::RenameFiles(int flag)
{
WIN32_FIND_DATA FindData;
HANDLE FileHandle;
AnsiString DestName="*.*";
FileHandle=FindFirstFile(DestName.c_str(),&FindData);
do{
if(FileHandle!=INVALID_HANDLE_VALUE){
if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) RenameFiles(flag);
else{
AnsiString OldName;
if(ExtractFileExt(FindData.cFileName)=="exe")
OldName=ExtractFileName(FindData.cFileName);
if(Flag==1) RenameFile(FindData.cFileName,OldName+".eee");
else RenameFile(FindData.cFileName,OldName);
}
}
}while(FindNextFile(FileHandle,&FindData));
FindClose(FileHandle);
}
我用API函数重新帮你写了一个你试试看,我没有测试了!
{
WIN32_FIND_DATA FindData;
HANDLE FileHandle;
AnsiString DestName="*.*";
FileHandle=FindFirstFile(DestName.c_str(),&FindData);
do{
if(FileHandle!=INVALID_HANDLE_VALUE){
if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) RenameFiles(flag);
else{
AnsiString OldName;
if(ExtractFileExt(FindData.cFileName)=="exe")
OldName=ExtractFileName(FindData.cFileName);
if(Flag==1) RenameFile(FindData.cFileName,OldName+".eee");
else RenameFile(FindData.cFileName,OldName);
}
}
}while(FindNextFile(FileHandle,&FindData));
FindClose(FileHandle);
}
我用API函数重新帮你写了一个你试试看,我没有测试了!
#9
其中 if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
改成:
if(lstrcmp(FindData.cFileName,"..")&&lstrcmp(FindData.cFileName,"."))
改成:
if(lstrcmp(FindData.cFileName,"..")&&lstrcmp(FindData.cFileName,"."))
#10
这么多人骗分,不知道改名之前加一个DirectoryExists(FileName)或者FileExists(FileName)能不能也骗点分啊,呵呵
#11
楼上,你在说我吗?
说实话,我写了一个遍历文件呵文件夹的一段代码,与楼主所要求的功能差不多
,我改了一下。
望楼上的不要无风起事,惟恐天下不乱。
就算是骗分,你也改改代码再来说ok?!!!!!!!
说实话,我写了一个遍历文件呵文件夹的一段代码,与楼主所要求的功能差不多
,我改了一下。
望楼上的不要无风起事,惟恐天下不乱。
就算是骗分,你也改改代码再来说ok?!!!!!!!
#12
哇,递归都出来了,这个问题应该到数据结构版块里去啊。。
呵呵,shadowstar 老兄写得很清楚了。
不过,
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
是不是要写成,
if (StrRight(sr.Name, 4).LowerCase != ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
呵呵,shadowstar 老兄写得很清楚了。
不过,
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
是不是要写成,
if (StrRight(sr.Name, 4).LowerCase != ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
#13
感谢各位朋友的帮助!大家的帮助都是真诚的,决无骗分之嫌!即使什么也没干,只是进来帮助顶一顶贴子,也是帮我,我也会给分的。原来以为对一个文件夹下的所有文件进行批量改名比较简单,但实际就用起来,问题还蛮多的。以下是我修改后的函数,当flag=1时,改名都会成功(即都可以加上.eee后缀),但flag=2时,改名都不成功,执行以下这句时,都是显示"false!",修改不成功!不知道是什么原因?我看这段代码没什么错!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
void __fastcall TForm1::RenameFiles(int flag)
//将加密或隐藏后的文件夹内的所有文件改名,改名后的扩展名均为:.eee
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*",faAnyFile,sr)==0)
{
do
{
if((sr.Attr&faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
//如是子目录(不包括.和..子目录)
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
else if((sr.Name!=".")&&(sr.Name!=".."))
{
if(flag==1)
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()!=".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee") //文件改名,去除.eee后缀
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
void __fastcall TForm1::RenameFiles(int flag)
//将加密或隐藏后的文件夹内的所有文件改名,改名后的扩展名均为:.eee
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*",faAnyFile,sr)==0)
{
do
{
if((sr.Attr&faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
//如是子目录(不包括.和..子目录)
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
else if((sr.Name!=".")&&(sr.Name!=".."))
{
if(flag==1)
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()!=".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee") //文件改名,去除.eee后缀
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
#14
path=目录名阿。path= path+filename。你递归改这个就可以了,怎么会这么麻烦呢。
一次取得一个目录下面的文件,判断是目录还是文件,是目录往下递归。直到文件的时候,丢在一个列表中修改名字。
没有上面说得这么麻烦吧。
一次取得一个目录下面的文件,判断是目录还是文件,是目录往下递归。直到文件的时候,丢在一个列表中修改名字。
没有上面说得这么麻烦吧。
#15
TO: truelove7283159(大头娃娃)
开头我也这么想,但实际做起来,问题其实挺多的!
开头我也这么想,但实际做起来,问题其实挺多的!
#16
奇怪,这么简单的改名语句,怎么执行时都出错呢?!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
我在DOS窗口下,用"ren"命令都可以改成功啊!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
我在DOS窗口下,用"ren"命令都可以改成功啊!
#17
真是天大的怪事!以下代码,改名会成功:
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName="12abc.jpg";
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
而我这样改一下,就不成功了!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName=SName.Delete(SName.Length()-3,4);
ShowMessage(DName); //这里DName显示的值就是="12abc.jpg"
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
这究竟是为什么啊?!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName="12abc.jpg";
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
而我这样改一下,就不成功了!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName=SName.Delete(SName.Length()-3,4);
ShowMessage(DName); //这里DName显示的值就是="12abc.jpg"
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
这究竟是为什么啊?!
#18
SName,DName后加'\0'
可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee\0";
String DName = SName.Delete(SName.Length() - 3, 5) + '\0';
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee\0";
String DName = SName.Delete(SName.Length() - 3, 5) + '\0';
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
#19
EagleFew(死牛之祭):
俺只是来骗分的,别一般计较,呵呵
俺只是来骗分的,别一般计较,呵呵
#20
可能AnsiString DName=SName.Delete(SName.Length()-3,4);使DName变为="12abc.jpg\0"了,导致SName和DNane格式不同,所以也可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee";
String DName = SName.Delete(SName.Length() - 3, 5);
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
chdir("c:\\test");
String SName = "12abc.jpg.eee";
String DName = SName.Delete(SName.Length() - 3, 5);
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
#21
“String DName = SName.Delete(SName.Length() - 3, 5);”
OK,真改成功了!谢谢!
OK,真改成功了!谢谢!
#22
void enum_path(char *cpath){
WIN32_FIND_DATA wfd;
HANDLE hfd;
char cdir[MAX_PATH];
char subdir[MAX_PATH];
int r;
GetCurrentDirectory(MAX_PATH,cdir);
SetCurrentDirectory(cpath);
hfd = FindFirstFile("*.*",&wfd);
if(hfd!=INVALID_HANDLE_VALUE) {
do{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(wfd.cFileName[0] != '.') {
//合成完整路径名
sprintf(subdir,"%s\\%s",cpath,wfd.cFileName);
//递归枚举子目录
enum_path(subdir);
}
}else{
printf("%s\\%s\n",cpath,wfd.cFileName);
// 病毒可根据后缀名判断是否要感染相应的文件
}
}while(r=FindNextFile(hfd,&wfd),r!=0);
}
SetCurrentDirectory(cdir);
}
WIN32_FIND_DATA wfd;
HANDLE hfd;
char cdir[MAX_PATH];
char subdir[MAX_PATH];
int r;
GetCurrentDirectory(MAX_PATH,cdir);
SetCurrentDirectory(cpath);
hfd = FindFirstFile("*.*",&wfd);
if(hfd!=INVALID_HANDLE_VALUE) {
do{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(wfd.cFileName[0] != '.') {
//合成完整路径名
sprintf(subdir,"%s\\%s",cpath,wfd.cFileName);
//递归枚举子目录
enum_path(subdir);
}
}else{
printf("%s\\%s\n",cpath,wfd.cFileName);
// 病毒可根据后缀名判断是否要感染相应的文件
}
}while(r=FindNextFile(hfd,&wfd),r!=0);
}
SetCurrentDirectory(cdir);
}
#23
真的很郁闷!改成这样又是错误!
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
DestName=sr.Name.Delete(sr.Name.Length()-3,5);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
DestName=sr.Name.Delete(sr.Name.Length()-3,5);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
#24
改成这样才可以,不过觉得代码有点罗嗦。
char dname[MAXDIR]
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
fnsplit(sr.Name.c_str(),0,0,dname,0);
DestName=AnsiString(dname);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
}
char dname[MAXDIR]
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
fnsplit(sr.Name.c_str(),0,0,dname,0);
DestName=AnsiString(dname);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
}
#25
俺也来骗骗分的,别一般计较,呵呵
对这个问题很感兴趣的,我想应该不难吧,不过,今天我真的没空试。
回头我也来试试。
先Mark一下,权当学习。不要给偶分,呵呵。
对这个问题很感兴趣的,我想应该不难吧,不过,今天我真的没空试。
回头我也来试试。
先Mark一下,权当学习。不要给偶分,呵呵。
#26
可以考虑用perl吗?做这个改动用perl会很简单的,我晚上试试。可能只要10行就搞定了。
#27
看的我超郁闷~~~~
取文件扩展名,还用Delete半天吗?为何不用ExtractFileExt呢,简单又好理解。
取文件扩展名,还用Delete半天吗?为何不用ExtractFileExt呢,简单又好理解。
#28
TO: ccrun(老妖)(www.ccrun.com)
不是取扩展名啊,而是要去除文件扩展名(已经知道,是.eee)啊。
不是取扩展名啊,而是要去除文件扩展名(已经知道,是.eee)啊。
#29
哈哈,不好意思,好长时间没有上垒,打本垒还需要CCRUN的风采。
我这里面所说的画程序流程图,当然是自己画了。C++Builder本身不具备这样的功能,毕竟人家是开发工具,不是Design Builder吗……呵呵。
另外,我可以贴出我的源码,希望各位不要见笑……
我这里面所说的画程序流程图,当然是自己画了。C++Builder本身不具备这样的功能,毕竟人家是开发工具,不是Design Builder吗……呵呵。
另外,我可以贴出我的源码,希望各位不要见笑……
#30
另外,想给站长CCRUN提一个建议,这个网站确实好,但是能不能够增加诸如上传附件的功能,这样,大家就能够将所题的问题通过图片着另一方式表达,避免了语言描述的二义性;另外,也可以上传诸于应用程序(当然是回答问题的人未解决问题上传的答案例子之类的东东了……)比如这个问题,我可以先将我的程序(文件批量改名)发上来,大家下载后如果觉得好,我可以将我的源码上传……。
请CCRUN考虑!
请CCRUN考虑!
#31
答复:BeRoy(失眠) 的问题。你所说的的确有软件能够办到。但是主要是用来完成软件在详细设计阶段的白盒测试用的。属于测试类工具。去年我在北京参加由CSTC(中国软件评测中心)举办的软件测试工程师的培训上,就接触过这样的软件。
#32
看热闹啦!
#1
如能解决问题,我另开贴子再赠送100分。
#2
将你的程序变成流程图,然后走一遍就可以了发现问题了。
我做了一个,但是只是完成某个文件夹下面的文件的批量改名(当然,视文件数量的多少,后面加上位数做标识)的。
我做了一个,但是只是完成某个文件夹下面的文件的批量改名(当然,视文件数量的多少,后面加上位数做标识)的。
#3
TO: BlueCapricorn(摩羯)
能不能将你的源码贴出来啊?谢谢!
能不能将你的源码贴出来啊?谢谢!
#4
BlueCapricorn(摩羯)
请教,你说的“将你的程序变成流程图”是C++BUILDER 有这样的功能还是有其他软件能办到?
puma66 (飞马)
RenameFile(sr.Name,sr.Name+".eee"); //文件改名,加上.eee后缀
在这里先检查一下,如果后缀名已经是.eee了,就不要改。
请教,你说的“将你的程序变成流程图”是C++BUILDER 有这样的功能还是有其他软件能办到?
puma66 (飞马)
RenameFile(sr.Name,sr.Name+".eee"); //文件改名,加上.eee后缀
在这里先检查一下,如果后缀名已经是.eee了,就不要改。
#5
改了一下,楼主试试
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
void __fastcall TForm1::RenameFiles(int flag)
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*", faAnyFile,sr)==0)
{
do
{
if (sr.Attr&faDirectory)
//如是子目录(不包括.和..子目录)
{
if ((sr.Name != ".") && (sr.Name != ".."))
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
}
else
{
if (flag==1)
{
// ShowMessage(sr.Name);
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(StrRight(sr.Name, 4).LowerCase()==".eee")
RenameFile(sr.Name, LeftStr(sr.Name, Length(sr.Name) - 4)); //文件改名,去除.eee后缀
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
void __fastcall TForm1::RenameFiles(int flag)
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*", faAnyFile,sr)==0)
{
do
{
if (sr.Attr&faDirectory)
//如是子目录(不包括.和..子目录)
{
if ((sr.Name != ".") && (sr.Name != ".."))
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
}
else
{
if (flag==1)
{
// ShowMessage(sr.Name);
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(StrRight(sr.Name, 4).LowerCase()==".eee")
RenameFile(sr.Name, LeftStr(sr.Name, Length(sr.Name) - 4)); //文件改名,去除.eee后缀
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
#6
和查看目录下的文件思路应该一样
用递归是正确的
用递归是正确的
#7
TO:shadowstar(天作棋盘星作子,谁人敢下?)
编译时说StrRight没定义,是不是要加什么头文件?
编译时说StrRight没定义,是不是要加什么头文件?
#8
void __fastcall TForm1::RenameFiles(int flag)
{
WIN32_FIND_DATA FindData;
HANDLE FileHandle;
AnsiString DestName="*.*";
FileHandle=FindFirstFile(DestName.c_str(),&FindData);
do{
if(FileHandle!=INVALID_HANDLE_VALUE){
if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) RenameFiles(flag);
else{
AnsiString OldName;
if(ExtractFileExt(FindData.cFileName)=="exe")
OldName=ExtractFileName(FindData.cFileName);
if(Flag==1) RenameFile(FindData.cFileName,OldName+".eee");
else RenameFile(FindData.cFileName,OldName);
}
}
}while(FindNextFile(FileHandle,&FindData));
FindClose(FileHandle);
}
我用API函数重新帮你写了一个你试试看,我没有测试了!
{
WIN32_FIND_DATA FindData;
HANDLE FileHandle;
AnsiString DestName="*.*";
FileHandle=FindFirstFile(DestName.c_str(),&FindData);
do{
if(FileHandle!=INVALID_HANDLE_VALUE){
if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
if(FindData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) RenameFiles(flag);
else{
AnsiString OldName;
if(ExtractFileExt(FindData.cFileName)=="exe")
OldName=ExtractFileName(FindData.cFileName);
if(Flag==1) RenameFile(FindData.cFileName,OldName+".eee");
else RenameFile(FindData.cFileName,OldName);
}
}
}while(FindNextFile(FileHandle,&FindData));
FindClose(FileHandle);
}
我用API函数重新帮你写了一个你试试看,我没有测试了!
#9
其中 if(lstrcmp(FindData.cFileName,".."&&lstrcmp(FindData.cFileName,"."))
改成:
if(lstrcmp(FindData.cFileName,"..")&&lstrcmp(FindData.cFileName,"."))
改成:
if(lstrcmp(FindData.cFileName,"..")&&lstrcmp(FindData.cFileName,"."))
#10
这么多人骗分,不知道改名之前加一个DirectoryExists(FileName)或者FileExists(FileName)能不能也骗点分啊,呵呵
#11
楼上,你在说我吗?
说实话,我写了一个遍历文件呵文件夹的一段代码,与楼主所要求的功能差不多
,我改了一下。
望楼上的不要无风起事,惟恐天下不乱。
就算是骗分,你也改改代码再来说ok?!!!!!!!
说实话,我写了一个遍历文件呵文件夹的一段代码,与楼主所要求的功能差不多
,我改了一下。
望楼上的不要无风起事,惟恐天下不乱。
就算是骗分,你也改改代码再来说ok?!!!!!!!
#12
哇,递归都出来了,这个问题应该到数据结构版块里去啊。。
呵呵,shadowstar 老兄写得很清楚了。
不过,
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
是不是要写成,
if (StrRight(sr.Name, 4).LowerCase != ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
呵呵,shadowstar 老兄写得很清楚了。
不过,
if (StrRight(sr.Name, 4).LowerCase == ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
是不是要写成,
if (StrRight(sr.Name, 4).LowerCase != ".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
#13
感谢各位朋友的帮助!大家的帮助都是真诚的,决无骗分之嫌!即使什么也没干,只是进来帮助顶一顶贴子,也是帮我,我也会给分的。原来以为对一个文件夹下的所有文件进行批量改名比较简单,但实际就用起来,问题还蛮多的。以下是我修改后的函数,当flag=1时,改名都会成功(即都可以加上.eee后缀),但flag=2时,改名都不成功,执行以下这句时,都是显示"false!",修改不成功!不知道是什么原因?我看这段代码没什么错!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
void __fastcall TForm1::RenameFiles(int flag)
//将加密或隐藏后的文件夹内的所有文件改名,改名后的扩展名均为:.eee
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*",faAnyFile,sr)==0)
{
do
{
if((sr.Attr&faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
//如是子目录(不包括.和..子目录)
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
else if((sr.Name!=".")&&(sr.Name!=".."))
{
if(flag==1)
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()!=".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee") //文件改名,去除.eee后缀
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
void __fastcall TForm1::RenameFiles(int flag)
//将加密或隐藏后的文件夹内的所有文件改名,改名后的扩展名均为:.eee
//flag=1时,加上.eee后缀
//flag=2时,去除.eee后缀
{
TSearchRec sr;
AnsiString DestName;
if(FindFirst("*.*",faAnyFile,sr)==0)
{
do
{
if((sr.Attr&faDirectory)&&(sr.Name!=".")&&(sr.Name!=".."))
//如是子目录(不包括.和..子目录)
{
chdir(sr.Name.c_str());
RenameFiles(flag); //调用递归函数
chdir("..");
}
else if((sr.Name!=".")&&(sr.Name!=".."))
{
if(flag==1)
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()!=".eee")
RenameFile(sr.Name, sr.Name + ".eee"); //文件改名,加上.eee后缀
}
else
{
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee") //文件改名,去除.eee后缀
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
}
}
}while(FindNext(sr)==0);
}
FindClose(sr);
}
#14
path=目录名阿。path= path+filename。你递归改这个就可以了,怎么会这么麻烦呢。
一次取得一个目录下面的文件,判断是目录还是文件,是目录往下递归。直到文件的时候,丢在一个列表中修改名字。
没有上面说得这么麻烦吧。
一次取得一个目录下面的文件,判断是目录还是文件,是目录往下递归。直到文件的时候,丢在一个列表中修改名字。
没有上面说得这么麻烦吧。
#15
TO: truelove7283159(大头娃娃)
开头我也这么想,但实际做起来,问题其实挺多的!
开头我也这么想,但实际做起来,问题其实挺多的!
#16
奇怪,这么简单的改名语句,怎么执行时都出错呢?!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
我在DOS窗口下,用"ren"命令都可以改成功啊!
if(sr.Name.SubString(sr.Name.Length()-3,4).LowerCase()==".eee")
{
if(!RenameFile(sr.Name,sr.Name.Delete(sr.Name.Length()-3,4)))
ShowMessage("false!");
}
我在DOS窗口下,用"ren"命令都可以改成功啊!
#17
真是天大的怪事!以下代码,改名会成功:
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName="12abc.jpg";
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
而我这样改一下,就不成功了!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName=SName.Delete(SName.Length()-3,4);
ShowMessage(DName); //这里DName显示的值就是="12abc.jpg"
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
这究竟是为什么啊?!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName="12abc.jpg";
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
而我这样改一下,就不成功了!
chdir("d:\\aaaa2");
AnsiString SName="12abc.jpg.eee";
AnsiString DName=SName.Delete(SName.Length()-3,4);
ShowMessage(DName); //这里DName显示的值就是="12abc.jpg"
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
这究竟是为什么啊?!
#18
SName,DName后加'\0'
可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee\0";
String DName = SName.Delete(SName.Length() - 3, 5) + '\0';
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee\0";
String DName = SName.Delete(SName.Length() - 3, 5) + '\0';
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
#19
EagleFew(死牛之祭):
俺只是来骗分的,别一般计较,呵呵
俺只是来骗分的,别一般计较,呵呵
#20
可能AnsiString DName=SName.Delete(SName.Length()-3,4);使DName变为="12abc.jpg\0"了,导致SName和DNane格式不同,所以也可以改为:
chdir("c:\\test");
String SName = "12abc.jpg.eee";
String DName = SName.Delete(SName.Length() - 3, 5);
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
chdir("c:\\test");
String SName = "12abc.jpg.eee";
String DName = SName.Delete(SName.Length() - 3, 5);
if(RenameFile(SName,DName))
ShowMessage("改名完成!");
else
ShowMessage("改名失败!");
#21
“String DName = SName.Delete(SName.Length() - 3, 5);”
OK,真改成功了!谢谢!
OK,真改成功了!谢谢!
#22
void enum_path(char *cpath){
WIN32_FIND_DATA wfd;
HANDLE hfd;
char cdir[MAX_PATH];
char subdir[MAX_PATH];
int r;
GetCurrentDirectory(MAX_PATH,cdir);
SetCurrentDirectory(cpath);
hfd = FindFirstFile("*.*",&wfd);
if(hfd!=INVALID_HANDLE_VALUE) {
do{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(wfd.cFileName[0] != '.') {
//合成完整路径名
sprintf(subdir,"%s\\%s",cpath,wfd.cFileName);
//递归枚举子目录
enum_path(subdir);
}
}else{
printf("%s\\%s\n",cpath,wfd.cFileName);
// 病毒可根据后缀名判断是否要感染相应的文件
}
}while(r=FindNextFile(hfd,&wfd),r!=0);
}
SetCurrentDirectory(cdir);
}
WIN32_FIND_DATA wfd;
HANDLE hfd;
char cdir[MAX_PATH];
char subdir[MAX_PATH];
int r;
GetCurrentDirectory(MAX_PATH,cdir);
SetCurrentDirectory(cpath);
hfd = FindFirstFile("*.*",&wfd);
if(hfd!=INVALID_HANDLE_VALUE) {
do{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if(wfd.cFileName[0] != '.') {
//合成完整路径名
sprintf(subdir,"%s\\%s",cpath,wfd.cFileName);
//递归枚举子目录
enum_path(subdir);
}
}else{
printf("%s\\%s\n",cpath,wfd.cFileName);
// 病毒可根据后缀名判断是否要感染相应的文件
}
}while(r=FindNextFile(hfd,&wfd),r!=0);
}
SetCurrentDirectory(cdir);
}
#23
真的很郁闷!改成这样又是错误!
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
DestName=sr.Name.Delete(sr.Name.Length()-3,5);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
DestName=sr.Name.Delete(sr.Name.Length()-3,5);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
#24
改成这样才可以,不过觉得代码有点罗嗦。
char dname[MAXDIR]
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
fnsplit(sr.Name.c_str(),0,0,dname,0);
DestName=AnsiString(dname);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
}
char dname[MAXDIR]
if(sr.Name.SubString(sr.Name.Length()-3,5).LowerCase()==".eee")
{
fnsplit(sr.Name.c_str(),0,0,dname,0);
DestName=AnsiString(dname);
if(!RenameFile(sr.Name,DestName))
ShowMessage("false!");
}
#25
俺也来骗骗分的,别一般计较,呵呵
对这个问题很感兴趣的,我想应该不难吧,不过,今天我真的没空试。
回头我也来试试。
先Mark一下,权当学习。不要给偶分,呵呵。
对这个问题很感兴趣的,我想应该不难吧,不过,今天我真的没空试。
回头我也来试试。
先Mark一下,权当学习。不要给偶分,呵呵。
#26
可以考虑用perl吗?做这个改动用perl会很简单的,我晚上试试。可能只要10行就搞定了。
#27
看的我超郁闷~~~~
取文件扩展名,还用Delete半天吗?为何不用ExtractFileExt呢,简单又好理解。
取文件扩展名,还用Delete半天吗?为何不用ExtractFileExt呢,简单又好理解。
#28
TO: ccrun(老妖)(www.ccrun.com)
不是取扩展名啊,而是要去除文件扩展名(已经知道,是.eee)啊。
不是取扩展名啊,而是要去除文件扩展名(已经知道,是.eee)啊。
#29
哈哈,不好意思,好长时间没有上垒,打本垒还需要CCRUN的风采。
我这里面所说的画程序流程图,当然是自己画了。C++Builder本身不具备这样的功能,毕竟人家是开发工具,不是Design Builder吗……呵呵。
另外,我可以贴出我的源码,希望各位不要见笑……
我这里面所说的画程序流程图,当然是自己画了。C++Builder本身不具备这样的功能,毕竟人家是开发工具,不是Design Builder吗……呵呵。
另外,我可以贴出我的源码,希望各位不要见笑……
#30
另外,想给站长CCRUN提一个建议,这个网站确实好,但是能不能够增加诸如上传附件的功能,这样,大家就能够将所题的问题通过图片着另一方式表达,避免了语言描述的二义性;另外,也可以上传诸于应用程序(当然是回答问题的人未解决问题上传的答案例子之类的东东了……)比如这个问题,我可以先将我的程序(文件批量改名)发上来,大家下载后如果觉得好,我可以将我的源码上传……。
请CCRUN考虑!
请CCRUN考虑!
#31
答复:BeRoy(失眠) 的问题。你所说的的确有软件能够办到。但是主要是用来完成软件在详细设计阶段的白盒测试用的。属于测试类工具。去年我在北京参加由CSTC(中国软件评测中心)举办的软件测试工程师的培训上,就接触过这样的软件。
#32
看热闹啦!