我正在尝试创建5000个垃圾文件,将它们写入文件并删除它们。但是这段代码只是将一部分文件写入文件。 ls -l | grep ^ - | wc -l说我有1598个文件剩余在目录中,应该用unlink();清空。如果我删除close(fd),如果我执行超过1000个文件,则会出现seg错误。有什么建议吗?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
main (int argv, char *args[]){
if(argv<3){
printf("Please run with proper command line arguements.\n");
return;
}
int numFiles = atoi(args[1]);
char *fileName = args[2];
char *fileList[numFiles];
int x, ret,fd;
char buff[50];
for(x=0;x<numFiles;x++){
ret = sprintf(buff,"./stuff/%s-%d.junk",fileName, x);
fd = creat(buff);
close(fd);
}
DIR *odir = opendir("./stuff");
struct dirent *rdir = NULL;
FILE *fp;
fp = fopen("./files.list", "w");
x=0;
while(rdir = readdir(odir)){
char* name = rdir->d_name;
ret = sprintf(buff,"./stuff/%s-%d.junk",fileName, x);
if(strcmp(name,"..")!=0){
if(strcmp(name,".")!=0){
fprintf(fp,"%s %d\n",name,x);
x++;
}
}
unlink(buff);
}
close(fp);
closedir(odir);
}
谢谢!
注意:分配需要使用creat(),opendir(),readdir()和unlink()。至于错误检查,当然你的权利,但我受时间限制和TA真的,真的不在乎......但是谢谢大家!
答案 0 :(得分:1)
您正在使用fopen
:
FILE *fp;
fp = fopen("./files.list", "w");
但是,您使用close
代替fclose
来关闭它:
close(fp);
我不确定这是导致你所看到的问题的原因,但无论如何它肯定是错的。您可能只想要unlink(rdir->d_name)
而不是unlink(buff)
。您在创建文件时将数字嵌入到文件名中 - 当您阅读所创建文件的名称时,不需要再次执行此操作。
答案 1 :(得分:0)
您在调用readdir
时正在从目录中删除内容;我认为应该可行,但您可能要考虑避免它。
更重要的是:当您使用readdir
遍历目录时,您可能正在列出readdir
列表中的不同文件。 (因为您传递给unlink
的内容是buff
,您已经从稳定递增的x
而不是readdir
返回的任何内容中填写了。)所以,这是一个玩具示例,以说明为什么这是有问题的。假设目录包含文件1,2,3,4,readdir按4,3,2,1的顺序列出它们。
最终文件3和4仍在目录中。