尝试读入目录的文件并将其写入列表

时间:2011-04-13 16:03:02

标签: c file-io segmentation-fault

我正在尝试创建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真的,真的不在乎......但是谢谢大家!

2 个答案:

答案 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的顺序列出它们。

  • readdir告诉您有关文件4.删除文件1。
  • readdir告诉您有关文件3.删除文件2.
  • readdir会告诉你关于文件2的信息,但它已经消失了,所以它没有。
  • readdir会告诉你有关文件1的信息,但它已经消失了,所以它没有。

最终文件3和4仍在目录中。