ブーストを使用してディレクトリの内容をリストし、各ファイルを繰り返し処理し、データ処理を行うコードがあります。結果は出力ファイル( '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;
}
私はポインタ/参照に何か間違っていますか? 大変助かりました!
投稿したコードに問題があるとお伝えしていますか?私はそこに何も進歩を見ないので、boost :: filesystemは何を問題と関係があるのでしょうか? –
'initFile'の残りの部分を表示する必要があるでしょう - 例外がスローされて開いているファイルが漏れていると思われます。 –
@ Paur R:例外を投げた場合、残りのループは実行されません。だからそれはできない。 – TonyK