2009-05-22 5 views
0

私は、ポータブルファイルシステムスキャナを作成し、特定のディレクトリパス上のすべてのファイルを再帰的にリストすることができます。これを行うにはCygwinを使用したC++再帰ファイル/ディレクトリスキャン

、私はdirent.hを利用して、私のコンパイラのためのcygwinを使用しようとすると、テンプレートを使用しています:

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

int main(void) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir("."); 
    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     // Stuff 
    }  
    closedir(d); 
    }  
    return(0); 
} 

しかし、同様の検索再帰的なディレクトリを追加する必要があります。これを行うには、私の解決策は、次のファイルでopendir()を試し、エラーコードがディレクトリとして正常に開かれたかどうかを判断することです(再帰します)。ディレクトリ 'と呼ばれ、ファイルとして表示されます。

私はそれが非常にklugeyだと認めますが、数時間の検索の後でさえも、移植性(win32ではなく)を保持できる優れた方法を見つけることができませんでした。

だから私の簡素化ソリューション(簡略化のためにいくつかの擬似)はこのような何かを探しています:

 
int scan(string startdir) 
{ 
    DIR   *d; 
    struct dirent *dir; 
    d = opendir(startdir.cstr()); 
    if (d) 
    { 
    while ((dir = readdir(d)) != NULL) 
    { 
     if(NOT '.' AND NOT '..') 
     { 
     if(temp = opendir(startdir + d) == NULL) 
     { 
      //FILE OR ERROR 
     }else{ 
      //Opened successfully as a directory, so recurse 
      scan(startdir + d->d_name + "\\"); 
     } 
     } 
    } 
    closedir(d); 
    } 
    return(0); 
} 

私は非常によものの(これは、それをシンプルに保つためにちょうど半分の書き換え擬似コードであるが、動作するようですこれを行うための良い方法についての提案に公開しています)。

私が気付いている主な問題は、特定のリンクファイル 'c:\ cygwin \ dev \ fd'です。このファイルはディレクトリとして開き、無限に繰り返し再帰的に開きます。

'fd'ファイルは4KB、拡張子なしの106バイトで、Windowsのどこにも指していないショートカットです。

このエラーは、いずれかのこのkludgey方法が盗聴されることを示していると思われる、または私がコンパイルしてるCygwinの実装に問題があります簡単な例として

:。

Error Reading: c:\cygwin\dev\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\5\fd\0 No such file or directory

ものを除きます。ディレクトリは、検索がうまくいくようです。しかし、私はスキャナに除外を厳密にコーディングすることで大丈夫ではない。

誰かがこの問題のアイデア、提案、解決策、または代替方法を持っている場合は、あなたの意見をいただければ幸いです。

ありがとうございました。

答えて

1

犯人は、私はそれが真実であることを保証するものではありませんが、私は、これは、独自のディレクトリ構造を再帰的にループにスキャナを有効にしているという印象の下で午前の/ proc/

にFDファイルへのリンクということのようです。

この問題に取り組むreadlink()の私の努力は当初は有望でしたが、より深いレベルのスキャンでは信頼できなくなり、エラーが引き続き発生することがわかりました。

私は今、この機能(すなわち、boost :: filesystem)を達成するための他の方法を検討しています。

0

これは仮想ファイルシステムです。シンボリックリンクを使用している可能性があります。 Cygwinはシンボリックリンクをサポートしていますので、それを考慮する必要があります。

1

ブーストを使用できるのであれば、boost::filesystemの使用を検討してください。チュートリアルには、簡単に再帰的に作業を拡張できる簡単なlsプログラムが含まれています。ライブラリには、ファイルの種類を照会するメソッドも含まれています。これにより、おそらく特定の問題を解決できます。

+0

おそらくいいアイデアですが、私は高等教育機関からのさらなる議論と承認が必要な他の図書館(無料のものも)を使用することを躊躇しています。私はそれをさらに調べてみよう(私はこれも他の場所でも言及しているのを見てきたように)、おそらくピッチを作るだろう。フィードバックをお寄せいただきありがとうございます – KevenK

0

cygwinにはすべてのUNIXツールが含まれています。

検索は非常に便利です。

0

cygwinライブラリにはftw()とfts()の両方があり、そのうちの1つを使用します。

0

あなたの例では、何かがファイルかディレクトリかを判断するためにopendir()をもう一度使ってみました。 "sys/stat.h"のstat()を使用すると、より直接的にこれを行うことができます。これはcygwinでも利用できるはずです。マクロS_ISREG()およびS_ISDIR()を使用して、通常のファイルまたはディレクトリをチェックすることができます。おそらくこのような何か:

struct stat *buf = new struct stat; 
    if(!stat(d->d_name, buf)) 
    { 
     if(S_ISREG(buf->st_mode)) 
     { 
      std::cout << " File: " << entry->d_name << "\n"; 
     } 
     if(S_ISDIR(buf->st_mode) && 

も、私は他のquestionに提供してきましたanswerを見てください。

関連する問題