ما هي الطريقة الصحيحة لاستخدام وظيفة القانون الأساسي () لاختبار إذا DIRENT هو الدليل أو ملف؟

StackOverflow https://stackoverflow.com/questions/1542763

  •  20-09-2019
  •  | 
  •  

سؤال

وأواجه بعض المتاعب مع 'إذا (S_IFDIR (stbuf.st_mode)) خط. هل هذه هي الطريقة الصحيحة لاختبار لدليل لRECURSE في؟ ويبدو أن وظيفة في الوقت الراهن للقيام بذلك الحق لل1 أو 2 الحلقات ومن ثم فشل وأخطاء تجزئة.

ولقد حاول يلي وربما أكثر كشرط.

S_ISDIR(st_mode)
((st_mode & ST_IFMT) == S_IFDIR)
S_IFDIR(stbuf.st_mode)

ولقد تضمنت وظيفة كاملة لأنني المعنية المشكلة قد تكون في مكان آخر.

void getFolderContents(char *source, int temp){
    struct stat stbuf;
    int isDir;
    dirPnt = opendir(source);
    if(dirPnt != NULL){
        while(entry = readdir(dirPnt)){
            char *c = entry->d_name;
            if(strcmp(entry->d_name, cwd) == 0 || strcmp(entry->d_name, parent) == 0){
            }
            else{
                stat(entry->d_name, &stbuf);
                printf("%i %i ", S_IFMT, stbuf.st_mode);
                if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                printf("DIR: %s\n", entry->d_name);
                getFolderContents(entry->d_name, 0);
            }
            printf("FILE: %s\n", entry->d_name);
        }
    }
    closedir(dirPnt);
}
هل كانت مفيدة؟

المحلول

نعم، هذا هو الصحيح. ولكن بما انك لا تتغير أبدا إلى الدليل، فإنك لن تجد ذلك.

والنظر في التسلسل الهرمي الدليل التالي:

 a
 |
 +- b
 |  |
 |  +- c
 ...

والتعليمات البرمجية الخاصة بك سوف تفحص الدليل الحالي، والبحث عن "أ". وستحدد أنه دليل، ويطلق على نفسه بشكل متكرر، ومفتوحة "أ" للقراءة. هذا يعمل. وهذا المسح العثور على دليل يسمى "ب"، ولكن في محاولة لفتحه باستخدام اسم الإدخال فقط ستفشل، لأن الطريق هو الآن "أ / ب".

وأوصي تغيير إلى الدليل (مع chdir()) قبل فتحه. وهذا يعني يمكنك opendir(".") فقط. تخزين المسار القديم، وchdir() من جديد عندما recursing هذا المستوى يتم (وليس قبل القيام مكالمة عودي إلى التعمق).

نصائح أخرى

وأين يتم تعريف الدخول؟ هو متغير محلي؟ لا استطيع ان ارى ماذا سيكون segfault، ولكن قد يكون عليك أن تجعل من متغير محلي. مثال واحد حيث سيكون لدغة لك هنا هو:

                    if(S_IFDIR(stbuf.st_mode)){            //Test DIR or file
                            printf("DIR: %s\n", entry->d_name);
                            getFolderContents(entry->d_name, 0);
                    }
                    printf("FILE: %s\n", entry->d_name);

ووprintf هو ستعمل طباعة اسم خاطئ، لذلك ربما يجب عليك إضافة آخر هنا.

ونفس الشيء صحيح مع dirpnt. عند الخروج من getFolderContents داخل حلقة في حين، كنت في نهاية المطاف تدعو readdir على dirpoint مغلقة، والتي ينبغي أن تحصل على الخروج من الحلقة.

ولكن كما ذكرت bahbar: لا يمكنك عنة وتخزين متغير مؤقت في متغير عمومي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top