3

Linuxで、子を反復処理せずにフォルダーにサブフォルダーがあるかどうかを確認しようとしています。私がこれまでに見つけた最も近いものはftw、最初のサブフォルダーを使用して停止するかscandir、結果を使用してフィルタリングすることです。ただし、どちらも私の目的にはやり過ぎです。単に「はい/いいえ」が必要です。

Windowsでは、これは、返された構造を呼び出しSHGetFileInfoてテストすることによって行われます。dwAttributes & SFGAO_HASSUBFOLDERLinuxにそのようなオプションはありますか?

4

3 に答える 3

4

標準的な答えは、ディレクトリでstatを呼び出し、次に st_nlink フィールド (「ハード リンクの数」) をチェックすることです。.標準のファイルシステムでは、各ディレクトリには 2 つのハード リンク (および親ディレクトリから現在のディレクトリへのリンク) があることが保証されているため、2 つを超える各ハード リンクはサブディレクトリ (具体的には..、現在のディレクトリへのサブディレクトリのリンク) を示します。

ただし、ファイルシステムはこれを実装する必要がないことを理解しているため (たとえば、このメーリング リストの投稿を参照)、動作することは保証されていません。

そうでなければ、あなたがしているのと同じことをしなければなりません:

  1. GNU 固有のフラグ、またはscandir、またはreaddirを指定したglobを使用して、ディレクトリの内容を反復処理します。GLOB_ONLYDIR
  2. 各結果に対してstatを呼び出しS_ISDIR(s.st_mode)、見つかったファイルがディレクトリであることを確認します。または、移植性がない場合は、チェックstruct dirent.d_typeDT_DIRます。それがファイルである場合、それDT_UNKNOWNが .
于 2010-04-05T18:12:17.023 に答える
2

あなたが言及した可能性 (および e.James の可能性) は、C++ プログラムよりもシェル スクリプトに適しているように思えます。「C++」タグが意図的なものであると仮定すると、POSIX API を直接使用した方がよいと思います。

// warning: untested code.
bool has_subdir(char const *dir) { 
    std::string dot("."), dotdot("..");
    bool found_subdir = false;    
    DIR *directory;

    if (NULL == (directory = opendir(dir)))
        return false;

    struct dirent *entry;
    while (!found_subdir && ((entry = readdir(directory)) != NULL)) {
        if (entry->d_name != dot && entry->d_name != dotdot) {
            struct stat status;
            stat(entry->d_name, &status);
            found_subdir = S_ISDIR(status.st_mode);
        }
    }
    closedir(directory);
    return found_subdir;
}
于 2010-04-05T18:19:43.887 に答える
0

getdirentriesはあなたがやりたいと思っていますか? ディレクトリがない場合は何も返さないはずだと思います。私はこれを自分で試してみましたが、一時的にLinuxボックスにアクセスできません:(

于 2010-04-05T18:02:05.263 に答える