2

ディレクトリ ツリーのウォークスルーに関する多くの例を見つけましたが、少し違うものが必要です。各呼び出しがディレクトリから 1 つのファイルを返し、ディレクトリ ツリーを徐々に移動するメソッドを持つクラスが必要です。どうすればこれを行うことができますか? 関数 FindFirstFile、FindNextFile、および FindClose を使用しています。私は C++ の初心者です。私はこのようなものを持っています...

たとえば、この単純なディレクトリツリーがあります

Parent(folder)\
   file1.txt
   file2.txt
   Child(folder)\
       file3.txt
       file4.txt

getNextFile() などのメソッドを持つクラスが必要です。最初の呼び出しは file1.txt を返します。2 番目の呼び出しは file2.txt を返し、3 番目の呼び出しは Child(folder) を返し、4 番目の呼び出しは file3.txt を返します。

重複フラグの編集:基本的に、do/while、while、または for なしでツリーをウォークスルーする必要があります...ブラウジングを中断したときに、後で使用するために保存でき、最後のファイルから続行できるある種のイテレータが必要ですが、理想的には winapi 呼び出しを使用する場合のみ

WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
    return false;
}
do
{
    //do some job with fdFile
}
while(FindNextFile(hFind, &fdFile));
4

2 に答える 2

2

適切なツールを使用してください。Boost はどこでも同じように利用でき、必要な方法があります。

http://rosettacode.org/wiki/Walk_a_directory/Recursively#C.2B.2Bから:

#include "boost/filesystem.hpp"
#include "boost/regex.hpp"
#include <iostream>

using namespace boost::filesystem;

int main()
{
  path current_dir("."); //
  boost::regex pattern("a.*"); // list all files starting with a
  for (recursive_directory_iterator iter(current_dir), end;
       iter != end;
       ++iter)
  {
    std::string name = iter->path().filename().string();
    if (regex_match(name, pattern))
      std::cout << iter->path() << "\n";
  }
}

ファイルが特定のパターンに一致するかどうかを気にしない場合は、正規表現ビジネス全体を削除してください。

編集:

API 呼び出しを直接使用することがなぜ悪いのか説明していただけますか?

  1. 醜くて読みにくく、正しく理解するのはさらに困難です。
  2. まったく移植性がありません。最も重要なことは、
  3. 生の win API を使用する場合、おそらく、対処しなければならない数百万のコーナー ケースがあります。Boost は、これを数百回実行し、深刻なコード レビューを経た人々によって書かれています。

要するに、winapi は約 20 年前のものです。世界の他の地域では、ユーザビリティが大幅に改善されています。本当に正当な理由がない限り、Boost などの一般的なライブラリを使用して、できるだけ多くを抽象化しようとします。

これで問題は解決しないと思います。元の投稿を編集して明確にしました。

基本的に、do/while、while、または for なしでツリーをウォークスルーする必要があります...後で使用するために保存できるある種のイテレータが必要です

それがまさに私の答えです。forループでイテレータを提供します。それについてあなたの編集の仕様を満たしていないものがわかりません。

さらに、Windows を搭載したさまざまなコンピューターで動作する必要があり、ブーストのインストールが問題になる可能性があるため、WinAPI のみを使用することをお勧めします。

これらのコンピューターにブーストをインストールする必要はありません。Boost::filesystem は静的に快適にリンクできます。boost_filesystem*.dllまた、これを行う古い学校の Windows の方法は、boost_system*.dllバイナリと共に配信するだけです。ただし、必要なすべての機能を含む単一の実行可能ファイルが目的の場合は、とにかく静的リンケージを使用するので、これはまったく問題ありません。

于 2015-04-10T08:02:34.650 に答える