2016-09-10 11 views
0

私は与えられたディレクトリ内のすべてのファイルを使って何かをする必要がある割り当てが与えられています。遭遇した各ディレクトリに対して、私たちはプログラムの別のインスタンスをforkすることになっています。 、一度親プロセスによって(私の最初のアプローチはopendir()readdir()使用していますが、私は、readdir()がディレクトリに(だけではなく、トップレベルの項目を)すべてエントリを列挙するように、いくつかのエントリが処理されます複数回を見つけましたファイルが "root"になるまで子プロセスごとに1回)。私は.に私のプログラムを起動した場合Unix C++のフォルダのルートにあるファイルとディレクトリを一覧表示

. 
├── 1.txt 
├── a 
│   ├── 2.txt 
│   ├── 3.txt 
│   └── c 
│    └── 4.txt 
└── b 
    └── 5.txt 

が、それは1.txt処理し、abための2つの子プロセス、1それぞれを作成し、それらのプロセスが終了するのを待ちます。たとえば、次のファイルシステムツリーを与えられました。

最初の子プロセスは2.txt3.txtで動作し、cの別の子プロセスを作成します。

第三子プロセスが簡単に言えば5.txt

上で動作します:私は私の最初のアプローチを使用し続けることができるか、ディレクトリ

の唯一のレベルを読み取ること見当もつかないが、私はそれのように感じます本当に私が現在調べている直接のフォルダにないものはすべて無視するのは非効率的です。


EDIT 1:コード例:だから

int process(std::string binpath, std::string src) 
{ 
     DIR* root = nullptr; 

     root = opendir(source.c_str()); 

     if(root == nullptr) 
     { 
      return -1; 
     } 

     struct dirent* details; 
     struct stat file; 
     std::string path; 

     std::queue<int> childPids; 

     bool error = false; 

     while((details = readdir(root)) != nullptr) 
     { 
      path = source + details->d_name; 
      lstat(path.c_str(), &file); 

      if(IsDirectory(file.st_mode)) 
      { 
       if(strcmp(details->d_name, ".") == 0 || strcmp(details->d_name, "..") == 0) 
       { 
        continue; 
       } 

       // Fork and spawn new process and remember child pid 
       auto pid = fork(); 
       if(pid == 0) 
       { 
        char* args[] = { 
          (char*) "-q", 
          (char*)"-s", const_cast<char*>(path.c_str()), 
          NULL 
        }; 
        char* env[] = {NULL}; 

        execve(binpath.c_str(), args, env); 
       } 
       else 
       { 
        childPids.push(pid); 
       } 
      } 
      else 
      { 
       if(!DoWorkOnFile(path)) error = true; 
      } 
     } 

     //Wait all child pids 

     while(!childPids.empty()) 
     { 
      auto pid = childPids.front(); 

      int status; 
      if(waitpid(pid, &status, 0) == pid) 
      { 
       if(status != 0) error = true; 
      } 
      else 
      { 
       error = true; 
      } 

      childPids.pop(); 
     } 

     closedir(root); 

     return error ? -1 : 0; 
} 
+0

コードを掲載することはできますか? 'readdir'はあなたが開いたディレクトリのエントリだけを読み込み、サブディレクトリのエントリは読み込みません。たとえば、ダイアグラムで '.'を開くと' read'は '.'、' ..'、 '1.txt'、' a'、 'b'を返します。 –

答えて

0

のは、あなたがのdirentを使用して、次のチュートリアルからのようなコードがあると仮定してみましょう:あなたは、ファイルとディレクトリを区別する必要がhttp://www.dreamincode.net/forums/topic/59943-accessing-directories-in-cc-part-i/

これはd_typeを通じてdirent構造体によって提供されます。

はこちらをご覧ください: http://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html

そのようにあなたは彼のリスト1つのディレクトリのファイルのみ行うことができます。

+0

私はちょうどこれを自分自身に遭遇しました。ファイルがディレクトリであるかどうかを確認していたようですが、正しく機能していないようです。 'd_type'の検査は私のために働きます。 – nlowe

+0

それはそれが行く方法です、エントリを繰り返し、あなたが望まないものをフィルタリングしてください:) –

関連する問題