2012-01-24 25 views
1

ブーストを使用してディレクトリの内容をリストし、各ファイルを繰り返し処理し、データ処理を行うコードがあります。結果は出力ファイル( 'histFile')に出力されます。"オープンファイルが多すぎます"

boost::filesystem::directory_iterator::construct: Too many open files: "/Users/.../.../.../directory_with_files"

私のコードは次のとおりです:〜2555個のファイルが処理された 後、私はエラーを取得する

for(int i = 0; i < 10000; i++) { 
    FILE *histFile; 
    string outputFileName = "somename"; 
    bool ifRet = initFile(histFile, outputFileName.c_str(), "a"); // 1 
    fclose(histFile);            // 2 
} 

私は上記の最後の2行をコメントアウトした場合( '1' と '2') 、コードは正常に終了します。したがって、 'histFile'のコピーが開いたままになっているようですが、私はどのように理解できません!これはメソッドの操作部分です:

bool initFile(FILE *&ofFile, const char *fileName, const char *openType, int overwriteOption) { 

if(overwriteOption < 0 || overwriteOption > 2) { 
    fprintf(stderr, "ERROR: ToolBox - initFile() : unknown 'overwriteOption' (%d), setting to (0)!\n", overwriteOption); 
} 

// Read-Only 
if(openType == "r") { 
    if(ofFile = fopen(fileName, "r")) { return true; } 
    fprintf(stderr, "ERROR: Could not open file (%s)!\n", fileName); 
    return false; 
} 

// Appending: 
if(openType == "a" || openType == "a+") { 
    // Check if file already exists 
    if(!fopen(fileName, "r")){ 
     fprintf(stderr, "ERROR: (%s) File does not Exist, cannot append!\n", fileName); 
     return false; 
    } 
    if(ofFile = fopen(fileName, openType)) { return true; }  
} 

// Writing: 
// if file already exists 
if(FILE *temp = fopen(fileName, "r")){ 
    if(overwriteOption == 2) { 
     fprintf(stderr, "ERROR: (%s) File Exists!\n", fileName); 
     return false; 
    } 
    if(overwriteOption == 1) { 

    } 
    if(overwriteOption == 0) { 
     char backupFileName[TB_CHARLIMIT], backupPrefix[TB_CHARLIMIT]; 
     strcpy(backupFileName, fileName);         // copy filename 
     // create a prefix w/ format '<YYYYMMDD>BACKUP_' 
     DateTime now; 
     sprintf(backupPrefix, "%s", now.getDateStr().c_str()); 
     strcat(backupPrefix, "BACKUP_"); 
     // add to copied filename, and move file 
     strcpy(backupFileName, prependFileName(backupFileName, backupPrefix)); 
     moveFile(fileName, backupFileName); 
    } 
    fclose(temp); 
} 

if(ofFile = fopen(fileName, openType)) { return true; } 


// Default: Return error and false 
fprintf(stderr, "ERROR: Could not open file (%s)!\n", fileName); 
return false; 
} 

私はポインタ/参照に何か間違っていますか? 大変助かりました!

+3

投稿したコードに問題があるとお伝えしていますか?私はそこに何も進歩を見ないので、boost :: filesystemは何を問題と関係があるのでしょうか? –

+0

'initFile'の残りの部分を表示する必要があるでしょう - 例外がスローされて開いているファイルが漏れていると思われます。 –

+0

@ Paur R:例外を投げた場合、残りのループは実行されません。だからそれはできない。 – TonyK

答えて

4

ファイルが既に存在する場合は、テストしているときには、このコードのビットでハンドル漏れている:

// Appending: 
if(openType == "a" || openType == "a+") { 
    // Check if file already exists 

    if(!fopen(fileName, "r")){  // <-- the FILE* opened here is leaked 

     fprintf(stderr, "ERROR: (%s) File does not Exist, cannot append!\n", fileName); 
     return false; 
    } 
    if(ofFile = fopen(fileName, openType)) { return true; }  
} 

は本当にそのチェックにする理由はありますか?なぜ、ファイルがまだ存在していなければ作成されるのではないのですか?

+0

ありがとう!それでおしまい。 「本当の」理由はありません。清潔さだけ。 – DilithiumMatrix

関連する問題