当我们在网上下载一些相同的文件时,文件名变成(2),(3)...
example
我想删除这些文件与C。首先,我想找到文件和打印。我写了一些代码吹。但它不工作。
int main(){
const char *path;
DIR *dir;
struct dirent* entry;
if((path=getenv("HOME"))==NULL){//get HOME path
path = getpwuid(getuid())->pw_dir;
}
const char *downloads = "/Downloads";
strcat(path,downloads); //make ~/Downloads
if(chdir(path)!=0){
perror("chdir()");
return -1;
}
if((dir=opendir(path))==NULL){ //open directory
perror("open");
return 1;
}
while((entry=readdir(dir))!=NULL){
struct dirent *cmpentry;
DIR *cmpdir;
if((cmpdir=opendir(path))==NULL){
perror("opendir");
return -1;
}
while((cmpentry=readdir(cmpdir))!=NULL){
if((entry->d_name[0]!='.')&&strcmp(entry->d_name,cmpentry->d_name)!=0){
char *ptr=strstr(cmpentry->d_name,entry->d_name);
if(ptr!=NULL)
printf("%s\n",cmpentry->d_name);
}
}
}
}
我该怎么修?
2条答案
按热度按时间guicsvcw1#
一系列问题......
path
* 没有 * 足够的空间用于strcat
,因此您有UB(未定义的行为)1.无需使用
chdir
1.没有
closedir
调用,因此对于一个大目录,您将用完文件描述符。1.不跳过
.
和..
条目1.使用
strcmp
和strstr
是 * 不 * 足够的。重复和/或未命中。1.重复打开同一个目录是缓慢/浪费的。最好读取目录 * 一次 * 并将条目保存在数组中。
一些修正:
1.撷取数组中的数据
1.使用一个辅助结构体(例如下面的
struct root
),将文件名拆分为组成部分(例如foo(1).pdf
--〉foo
、(1)
和.pdf
)1.添加了长度和文件内容的比较
下面是原始代码,并标注了错误:
在上面的代码中,我使用了
cpp
条件语句来表示旧代码和新代码:注意:通过
unifdef -k
运行文件可以清除此问题下面是重构后的代码,它带有注解:
下面是一个测试
perl
脚本:下面是测试程序的输出:
ikfrs5lh2#
readdir()不像ls那样读取文件,而是按照它在目录中的位置顺序读取文件。你的程序有一个工作变体,但是它工作错误,不是你想要的方式。请自行更正它。