C++のディレクトリ内のフォルダを、理想的にはポータブル(主要なオペレーティングシステムで動作する)な方法で一覧表示したいと思います。 POSIXを使用してみましたが、正しく機能しますが、見つかったアイテムがフォルダーであるかどうかを確認するにはどうすればよいですか?
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;
}
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;
}
以下は、 ファイルシステムのドキュメントのブースト からの(わずかに変更された)引用に続き、それを行う方法を示しています。
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
}
}
}
}
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
}
PhysFS に言及せざるを得ないと感じています。私はそれを自分のプロジェクトに統合しました。真のクロスプラットフォーム(Mac/Linux/PC)ファイル操作を提供し、Zip、7Zip、pakなどのさまざまなアーカイブ定義を解凍することもできます。いくつかの関数( PHYSFS_isDirectory 、 PHYSFS_enumerateFiles )があり、要求しているものも判別できます。