私はC++の学習を始めたばかりで、現在コードブロックを使用しています。サブディレクトリを含むディレクトリ内のファイルを検索できるアプリケーションを作成したいのですが、これに関する適切な例が見つからないようで、boostなどのライブラリを介してのみ可能であるとどこかで読んだことがあります。
- これは本当ですか?
- ライブラリなしでそれを行う例はありますか?
前もって感謝します
私はC++の学習を始めたばかりで、現在コードブロックを使用しています。サブディレクトリを含むディレクトリ内のファイルを検索できるアプリケーションを作成したいのですが、これに関する適切な例が見つからないようで、boostなどのライブラリを介してのみ可能であるとどこかで読んだことがあります。
前もって感謝します
OSシステムコール、たとえばLinuxのreaddirを使用して使用することもできます。boost(および他のライブラリ)を使用すると、いくつかの(すべて?)OS用のポータブルコードを記述できます。
ここで、手の込んだ例を見つけることができますhttp://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046380353&id=1044780608
はい、本当です。標準 C++ (C++17 より前) には、ディレクトリの内容を一覧表示するための API がありません。
そのため、ライブラリ (Boost など) を使用するか、使用しているオペレーティング システムのネイティブ コール (Windows では FindFirstFile/FindNextFile、Unix では opendir/readdir) を使用して実行します。他の回答にはサンプルコードがあります。
しかし、C++ の学習を始めたばかりの場合は、今のところこれらに苦労しない方がよいでしょう。最初は標準 C++ の学習に集中してください。念頭に置いていたアプリケーションを作成することは有益な演習ですが、標準 C++ に慣れるまで少し延期します。
ブーストはディレクトリをスキャンする唯一の方法ではありませんが、おそらくプラットフォームに依存しない方法で実行する最も簡単な方法です。つまり、プラットフォーム固有の API (Win32 など) を使用しません。
ブーストを使用した簡単な例を次に示します。
#include <boost/filesystem.hpp>
#include <iostream>
#include <iterator>
#include <set>
std::set<boost::filesystem::path> getDirContents (const std::string& dirName)
{
std::set<boost::filesystem::path> paths;
std::copy
( boost::filesystem::directory_iterator (dirName)
, boost::filesystem::directory_iterator ()
, std::inserter (paths, paths.end ())
);
return paths;
}
int main (int argc, char* argv[])
{
std::set<boost::filesystem::path> paths = getDirContents ("C:\\");
std::copy
( paths.begin ()
, paths.end ()
, std::ostream_iterator<boost::filesystem::path> (std::cout, "\n")
);
return 0;
}