Попытка прочесть файлы каталога и записать его в список - PullRequest
0 голосов
/ 13 апреля 2011

Я пытаюсь создать 5000 ненужных файлов, записать их в файл и удалить их. Но этот код только записывает часть файлов в файл. ls -l | grep ^ - | wc -l говорит, что в каталоге осталось 1598 файлов, которые должны быть очищены с помощью unlink () ;. Если я удаляю close (fd), я получаю ошибку seg, если я делаю больше 1000 файлов. Есть предложения?

#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);
}

Спасибо! * * 1004

Примечание. Для выполнения задания требовалось использовать creat (), opendir (), readdir () и unlink (). А что касается проверки на ошибки, ваше право, конечно, но я нахожусь под временным ограничением, и ТП действительно, действительно, все равно ... Но спасибо всем!

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Здесь вы используете fopen:

FILE *fp;
fp = fopen("./files.list", "w");

Но тогда вы используете close вместо fclose, чтобы закрыть его:

close(fp);

Я совсем не уверен, что именно это вызывает проблему, которую вы видите, но в любом случае это определенно неправильно. Вы, вероятно, просто хотите unlink(rdir->d_name) вместо unlink(buff). Вы ввели номер в имя файла при его создании - вам не нужно делать это снова, когда вы читаете по имени файла, который вы создали.

0 голосов
/ 13 апреля 2011

Вы удаляете вещи из каталога при вызове 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 все еще находятся в каталоге.

...