web-dev-qa-db-ja.com

ディレクトリ内のフォルダのみを一覧表示する

C++のディレクトリ内のフォルダを、理想的にはポータブル(主要なオペレーティングシステムで動作する)な方法で一覧表示したいと思います。 POSIXを使用してみましたが、正しく機能しますが、見つかったアイテムがフォルダーであるかどうかを確認するにはどうすればよいですか?

20
m4tx

C++ 17の使用 std::filesystem ライブラリ:

std::vector<std::string> get_directories(const std::string& s)
{
    std::vector<std::string> r;
    for(auto& p : std::filesystem::recursive_directory_iterator(s))
        if (p.is_directory())
            r.Push_back(p.path().string());
    return r;
}
10
wally

opendir()readdir()を使用して、ディレクトリとサブディレクトリを一覧表示できます。次の例では、現在のパス内のすべてのサブディレクトリを出力します。

#include <dirent.h>
#include <stdio.h>

int main()
{
    const char* PATH = ".";

    DIR *dir = opendir(PATH);

    struct dirent *entry = readdir(dir);

    while (entry != NULL)
    {
        if (entry->d_type == DT_DIR)
            printf("%s\n", entry->d_name);

        entry = readdir(dir);
    }

    closedir(dir);

    return 0;
}
26
David Alfonso

以下は、 ファイルシステムのドキュメントのブースト からの(わずかに変更された)引用に続き、それを行う方法を示しています。

void iterate_over_directories( const path & dir_path )         // in this directory,
{
  if ( exists( dir_path ) ) 
  {
    directory_iterator end_itr; // default construction yields past-the-end
    for ( directory_iterator itr( dir_path );
          itr != end_itr;
          ++itr )
    {
      if ( is_directory(itr->status()) )
      {
        //... here you have a directory
      }
    }
  }
}
10
Benoît

stat関数を検索します。 ここ は説明です。いくつかのサンプルコード:

struct stat st;
const char *dirname = "dir_name";
if( stat( dirname, &st ) == 0 && S_ISDIR( st.st_mode ) ) {
    // "dir_name" is a subdirectory of the current directory
} else {
    // "dir_name" doesn't exist or isn't a directory
}
5
Graeme Perrow

PhysFS に言及せざるを得ないと感じています。私はそれを自分のプロジェクトに統合しました。真のクロスプラットフォーム(Mac/Linux/PC)ファイル操作を提供し、Zip、7Zip、pakなどのさまざまなアーカイブ定義を解凍することもできます。いくつかの関数( PHYSFS_isDirectoryPHYSFS_enumerateFiles )があり、要求しているものも判別できます。

2
James

Windowsでは、_findfirst()と_findnext()を使用してディレクトリの内容を反復処理し、CreateFile()とGetFileInformationByHandle()を使用して、特定のエントリがディレクトリかフォルダかを判断できます。 (はい、CreateFile()は、適切な引数を使用して、既存のファイルを調べます。人生は壮大ではありませんか?)

参考までに、これらの呼び出しを使用するコードを実装したいくつかのクラスを見ることができます ここ および ここ

1
Jeremy Friesner