C - 列出文件夹和所有子文件夹中包含的文件

时间:2013-05-07 20:53:43

标签: c directory subdirectory readdir

我有一个函数可以读取单个输入目录中包含的所有文件。
我想让该函数不仅读取“main”目录中的文件,还读取所有子目录中包含的文件。

为了做到这一点,我写了这段代码:

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>

struct dirent *readdir(DIR *dirp);
char * percorso;
DIR *cartella;
struct dirent *elemento;



char * scrivi(char * a, char * b)
{

char *targetdir = malloc(2048);
strcpy(targetdir,a);
strcat(targetdir,"/");
strcat(targetdir,b);

printf("%s \n", targetdir); 
return targetdir;
}    

void scorriFolder(char* nome)
{
if ((cartella = opendir(nome)) == NULL)         
    perror("opendir() error");                      
else {
    printf("contents of root: \n");
    while ((elemento = readdir(cartella)) != NULL)
    {                                               
        if(elemento->d_type == DT_DIR)
        {
            if(elemento->d_name != ".." || elemento->d_name != ".")
            {
                percorso = scrivi(nome, elemento->d_name);
                scorriFolder(percorso);
            }
        }
        else 
        {
            printf("  %s\n", elemento->d_name); 
        }
    }
    closedir(cartella);                         
}
}    

main(int argc, char * argv[]) {
scorriFolder(argv[1]);
} 

但它甚至没有编译,说:

warning: incompatible implicit declaration of built-in function ‘malloc’
warning: incompatible implicit declaration of built-in function ‘strcpy’
warning: incompatible implicit declaration of built-in function ‘strcat’

据我所知,此问题是由于传递到mallocstrcpystrcat函数的变量格式错误所致。 (elemento->d_name的类型为char,而char*

为了让这段代码有效,我该怎么办?

感谢。

修改

这是一个有效的while代码段:

while ((elemento = readdir(cartella)) != NULL)

{               
        if ( strcmp(elemento->d_name, ".")  == 0)
        {
            continue;
        }
        if ( strcmp(elemento->d_name, "..")  == 0)
        {
            continue;
        }
            if(elemento->d_type == DT_DIR)
            {

                {
                    percorso = scrivi(nome, elemento->d_name); 
                    scorriFolder(percorso);
                }
            }
            else 
            {
                printf("  %s\n", elemento->d_name); 
            }
        }

一旦扫描到一个子目录,它就会崩溃,因为当程序退出子目录时路径没有更新。我正在努力解决它。

1 个答案:

答案 0 :(得分:5)

您需要将#include <stdlib.h>#include <string.h>添加到文件的开头。

warning: incompatible implicit declaration of built-in function ‘malloc’

此错误消息告诉您编译器无法确定malloc的返回类型和参数。我认为如果找不到返回类型,编译器会假定为int。哪个不是void * malloc实际返回的。

malloc在<stdlib.h>

中定义

strcpy和strcat在<string.h>

中定义

要了解这些函数的定义位置,您可以通过键入man mallocman strcpyman strcat

来阅读该手册页