1

単一の入力ディレクトリに含まれるすべてのファイルを読み取る関数があります。
その関数が「メイン」ディレクトリ内のファイルだけでなく、すべてのサブディレクトリに含まれるファイルも読み取れるようにしたかったのです。

そうするために、私はこのコードを書きました:

#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’

私の知る限り、この問題はmalloc,strcpyおよびstrcat関数に渡される変数の形式が間違っていることが原因です。(型を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); 
            }
        }

サブディレクトリをスキャンすると、プログラムがサブディレクトリから終了するときにパスが更新されないため、クラッシュします。私はそれを修正しようとしています。

4

1 に答える 1