Я попробовал этот код на Fedora, но получил ошибки No such file or directory и Permission denied.

Как справиться с ошибками и продолжить сканирование файловой системы?

ftw() разбивается, если что-то идет не так. Как пропустить неудачные записи?

ftw() запускается с пути /.

#define _XOPEN_SOURCE 500
#include 
#include 
#include 

FILE * output;

static int display_info(const char * fpath, const struct stat * st, int tflag)
{
    switch(tflag){
        case FTW_F://ok, file
            break;
        case FTW_D://ok, directory
            break;
        case FTW_SL://symlink
            return -1;
        case FTW_NS://stat failed
            return -1;
        case FTW_DNR://read failed
            return -1;
    }
    fprintf(output, fpath);
    fprintf(output, "\n");
    return 0;
}
int main(int argc, char * argv[])
{
    time_t t0;
    time(&t0);
    output = fopen("/home/sad/output.txt", "w");
    if(argc < 2){
        printf("Usage: %s [path]\n", argv[0]);
        return -1;
    }
    if(ftw(argv[1], display_info, 99) == -1){
        perror("???ftw()");
        return -1;
    }
    fclose(output);
    time_t t1;
    time(&t1);
    printf("%.3f seconds\n", difftime(t1, t0));
    return 0;
}

Danila Smirnov

Ответов: 1

Ответы (1)

Ваш код возвращает -1 всякий раз, когда путь, переданный в display_info, не может быть доступен, поэтому ftw делает именно то, что он должен делать - останавливает обход.

Если вы хотите, чтобы это продолжалось, продолжайте возвращать 0 даже в этих случаях.

Лучшим решением было бы использование более новой, более продвинутой функции nftw.

Это позволит вам указать флаги для автоматического игнорирования динамических ссылок, а также позволит вашей функции обратного вызова указывать различные действия в случае, если некоторые элементы недоступны.

Например, вы можете попросить его игнорировать дочерние элементы недоступных каталогов:

    case FTW_NS://stat failed
        return FTW_SKIP_SUBTREE;
    case FTW_DNR://read failed
        return FTW_SKIP_SUBTREE;

По умолчанию, практически в любом дистрибутиве Linux, при переходе от / некоторые папки будут недоступны, если только вы не работаете от имени root или не используете sudo.

Также, некоторые файлы не будут настоящими файлами, и вы можете воспользоваться возможностью использовать FTW_SKIP_SUBTREE, чтобы пропустить такие папки, как proc и dev.

2022 WebDevInsider