1

このコードを書いて、すべてのファイル/home/keepを絶対パスで出力します。

#include <dirent.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void catDIR(const char *re_path);

int main(int argc, char *argv[])
{
    char *top_path = "/home/keep";
    catDIR(top_path);
    return 0;
}

void catDIR(const char *re_path)
{
    DIR *dp;
    struct stat file_info;
    struct dirent *entry;

    if ((dp = opendir(re_path)) == NULL)
    {
        perror("opendir");
        return;
    }
    while (entry = readdir(dp))
    {
        if (entry->d_name[0] == '.')
            continue;

        //get Absolute path
        char next_path[PATH_MAX];
        strcpy(next_path, re_path);
        strcat(next_path, "/");
        strcat(next_path, entry->d_name);

        lstat(next_path, &file_info);

        if (S_ISDIR(file_info.st_mode))
        {
            catDIR(next_path);
        }
        else
        {
            printf("%s/%s\n", re_path, entry->d_name);
        }
    }
    free(dp);
    free(entry);
}

実行すると。

一部のファイルのパスを出力するだけでなく、いくつかのエラー メッセージも出力します。

opendir: Too many open files

を読んman 3 opendirで、開いたファイルが多すぎることに気付きました。

知りたいのですが、閉じる方法を教えてください。このプログラムを修正する方法

4

2 に答える 2

4

closedirディレクトリの内容の反復処理を終了するときに、おそらく使用する必要があります。

また、ディレクトリのリストを配列に読み込み、ディレクトリを閉じてから、配列で再帰することもできます。これは、非常に深いディレクトリ構造をトラバースするのに役立つ場合があります。

于 2012-04-29T02:57:20.513 に答える
1

走る

cat /proc/sys/fs/file-nr

それは何を与えるのですか?
出力形式: (割り当てられたファイル ハンドラーの数) - (割り当てられているが未使用のファイル ハンドラーの数) - (ファイル ハンドラーの最大数)

割り当てられているが未使用のファイル ハンドラーの数が増えた場合は、@Matthew Iselin で言及されているように、ディレクトリを閉じる必要があることを意味します。
システム制限を変更することもできます。

システム制限の変更に関する詳細情報は、ここにあります

于 2012-04-29T03:05:47.377 に答える