0

この質問を検索しようとしましたが、満足のいく答えが見つかりませんでした。だからここに私の質問があります:

次のコードのバリエーションを使用して、ディレクトリをトラバースしています。

私。

#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>

void traverseDirectory(char name[100]){
        DIR* dir;
        struct dirent *ent;
        struct stat states;

        dir = opendir(name);

        while((ent=readdir(dir)) != NULL){
                stat(ent->d_name,&states);
                if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
                        continue;
                }
                else{
                        printf("%s/%s\n",name,ent->d_name);
                        if(S_ISDIR(states.st_mode)){
                                strcat(name,"/");
                                strcat(name,ent->d_name);
                                traverseDirectory(name);
                        }
                }
        }

        closedir(dir);
}

int main(){
        char path[100];
        printf("Enter the path:\n");
        scanf("%s",&path);
        traverseDirectory(path);
}

これはサブディレクトリをトラバースしますが、最初のサブディレクトリをトラバースしてそのファイルを印刷した後、セグメンテーション違反を引き起こします。

出力は次のとおりです。

Enter the path:
/home/harshad/dump

/home/harshad/dump/TraverseDirectory.c

/home/harshad/dump/temp

/home/harshad/dump/temp/temptest.txt
Segmentation fault

Ⅱ.

#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>

void traverseDirectory(char name[100]){
        DIR* dir;
        struct dirent *ent;
        struct stat states;

        dir = opendir(name);

        while((ent=readdir(dir)) != NULL){
                stat(ent->d_name,&states);
                if(!strcmp(".", ent->d_name) || !strcmp("..", ent->d_name)){
                        continue;
                }
                else{
                        printf("%s/%s\n",name,ent->d_name);
                        if(S_ISDIR(ent->d_type & DT_DIR)){
                                strcat(name,"/");
                                strcat(name,ent->d_name);
                                traverseDirectory(name);
                        }
                }
        }

        closedir(dir);
}

int main(){
        char path[100];
        printf("Enter the path:\n");
        scanf("%s",&path);
        traverseDirectory(path);
}

これは、指定されたディレクトリ内のすべてのファイルとサブディレクトリを出力しますが、サブディレクトリをトラバースしません。出力は次のとおりです。

Enter the path:
/home/harshad/dump

/home/harshad/dump/TraverseDirectory.c

/home/harshad/dump/temp

/home/harshad/dump/TraverseDirectory1.out

/home/harshad/dump/dump

/home/harshad/dump/test.txt

/home/harshad/dump/SortMarks.c

/home/harshad/dump/TraverseDirectory.out

/home/harshad/dump/TraverseDirectoryTemp.out

/home/harshad/dump/TraverseDirectory1.c

/home/harshad/dump/TraverseDirectoryTemp.c

/home/harshad/dump/FindEven.c

ここで、dump と temp はサブディレクトリで、それぞれにいくつかのファイルが含まれています。最初に、ユーザーのアクセス許可のためにサブディレクトリをトラバースできない可能性があると考えました (ルートによって作成および所有されているため) が、最初のプログラムの出力でわかるように、そうではありません。そのため、両方のプログラムの問題を把握できません。PS: 最初の 2 行の後の出力では、プログラムはディレクトリとファイルを出力します。

4

2 に答える 2

5

のエラーを実際に確認する必要がありますopendir()。失敗すると が返さNULLれ、次readdir()は seg-fault になります。

これで十分かもしれません:

dir = opendir(name);
if (!dir)
{
    perror(name);
    return;
}
于 2015-06-30T08:04:05.743 に答える