在c中正确使用ftw()

时间:2013-10-22 04:13:38

标签: c linux unix directory file-traversal

我的代码中有以下内容:(在c中编码)

    ftw(argv[2], parseFile, 100)  

argv [2]是本地目录路径。例如。 argv [2] =“TestCases”并且在我的.o文件所在的目录中有一个testcases文件夹。

我的理解是,这应该遍历目录TestCases并将它找到的每个文件发送到函数parseFile。

实际发生的是它只是将我的参数发送到函数parseFile,这就是全部。我究竟做错了什么?我怎么能正确使用它?

编辑:这是parseFile:

int parseFile(const char * ftw_filePath,const struct stat * ptr, int flags){
    FILE * file;
    TokenizerT * currFile;
    char fileString[1000], * currWord, * fileName;

    fileName = strdup(ftw_filePath);

    if( fileName == NULL || strlen(fileName) <= 0){
        free(fileName);
        return -1;
    }
    printf("\n%s\n",fileName);
    if(strcmp(fileName,"-h")== 0){
        printf("To run this program(wordstats) type './wordstat.c' followed by a space followed by the file's directory location. (e.g. Desktop/CS211/Assignment1/test.txt )");
        free(fileName);
        return 1;
    }
    else{
        file=fopen(fileName,"r");
    }

    if(!file){
        fprintf(stderr,"Error: File Does not Exist in designated location. Please restart the program and try again.\n");
        free(fileName);
        return 0;
    }
    memset(fileString, '\0', 1000);

    while(fscanf(file,"%s", fileString) != EOF){ /* traverses the file line by line*/
            stringToLower(fileString);
            currFile = TKCreate("alphanum",fileString);

            while((currWord = TKGetNextToken(currFile)) != NULL) {

                insert_List(currWord, words,fileName);

            }
            free(currFile->delimiters);
            free(currFile->copied_string);

            free(currFile);
        memset(fileString, '\0', 1000);
    }

    fclose(file);
    free(fileName);
    return 1;
}

如果我为我的argv [2]输入TestCases / big.txt,它会起作用,但如果我输入TestCases则不行

2 个答案:

答案 0 :(得分:1)

man page中所述,ftw调用的函数的非零返回值告诉ftw停止运行。

您的代码有各种返回语句,但唯一返回0的是错误条件。

答案 1 :(得分:0)

正确设计的C回调接口有一个void *参数,您可以使用该参数将周围代码中的任意数据传递给回调。 [n] ftw没有这样的论点,所以你有点像一条小溪。

如果您的编译器支持线程局部变量(__thread存储说明符),您可以使用它们而不是全局变量;这会起作用,但并不比全局变得那么整洁。

如果您的C库具有fts系列函数,请改用它们。它们适用于大多数现代Unix(包括Linux,OSX和最近的* BSD)