我正在开发一个程序,它创建2000个目录并在每个目录中放入一个文件(只有10KB左右的文件)。我正在使用mkdir制作dirs和ofstream(我也试过fopen)将文件写入固态驱动器(我正在进行速度测试以进行比较)。
当我运行代码时,目录创建正常但文件在写入1000左右后停止写入。我尝试在每次写入之前设置一个延迟,以防它出现某种过载,并尝试使用fopen代替ofstream,但它总是停止在第1000个文件标记周围写入文件。
这是写入文件的代码,并告诉我哪个文件失败了。
fsWriteFiles.open(path, ios::app);
if(!fsWriteFiles.is_open())
{
cout << "Fail at point: " << filecount << endl;
return 1;
}
fsWriteFiles << filecontent;
fsWriteFiles.close();
有没有人有这方面的经验或有任何理论?
这是完整的代码: 此代码从随机数创建一个2位十六进制目录,然后从随机数创建一个4位十六进制目录,然后将文件存储在该目录中。 在写完1000个文件后,它以“失败点”(我已经添加了一个cout)退出。 这表示它无法创建文件,但它应该已经检查过该文件不存在。 有时它从0开始失败,从底线击中第二个(文件已存在的else子句)。任何帮助赞赏,我觉得这是与我正在尝试创建已经存在的文件,但我的文件存在检查不知何故滑落。 有没有办法为失败的文件创建尝试获取错误消息?
int main()
{
char charpart1[3] = "";
char charpart3[5] = "";
char path[35] = "";
int randomStore = 0;
//Initialize random seed
srand(time(NULL));
struct stat buffer ;
//Create output file streams
ofstream fsWriteFiles;
ifstream checkforfile;
//Loop X times
int dircount = 0;
while(dircount < 2000)
{
path[0] = '\0'; //reset the char array that holds the path
randomStore = rand() % 255;
sprintf(charpart1, "%.2x", randomStore);
randomStore = rand() % 65535;
sprintf(charpart3, "%.4x", randomStore);
//Check if top level dir exists, create if not
strcat(path, "fastdirs/");
strcat(path, charpart1);
DIR *pdir=opendir(path);
//If the dir does not exist create it with read/write/search permissions for owner
// and group, and with read/search permissions for others
if(!pdir)
mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
//Check if 3rd level dir exists, create if not
strcat(path, "/");
strcat(path, charpart3);
DIR *pdir3=opendir(path);
if(!pdir3)
mkdir(path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
strcat(path, "/");
strcat(path, charpart3);
strcat(path, ".txt");
//Write the file if it does not already exist
checkforfile.open(path, fstream::in);
if (checkforfile.is_open() != true)
{
fsWriteFiles.open(path, ios::app);
if(!fsWriteFiles.is_open())
{
cout << "Fail at point: " << dircount << "\n" << endl;
return 1;
}
fsWriteFiles << "test";
fsWriteFiles.flush();
fsWriteFiles.close();
dircount ++; //increment the file counter
}
else
{
cout << "ex";
checkforfile.close();
}
}
}
答案 0 :(得分:6)
你用opendir()打开目录但是从不用closedir()关闭它们 - 我怀疑那里也有资源限制。
答案 1 :(得分:1)
你关闭文件了吗?听起来像是文件描述符限制,通常是1024.要进行简单的检查,请尝试“ulimit -n 4096”再次执行程序。
答案 2 :(得分:1)
我发布的代码看不出任何明显错误的内容,但是您没有为任何人提供足够的上下文帮助。
但是,如果您使用RAII确保文件已关闭,我会更高兴,使用ofstream构造函数/析构函数来执行打开/关闭: -
for (int i=0; i != MAX_FILES; ++i)
{
ofstream sWriteFiles(getFilePath(i), ios::app);
if (!fsWriteFiles.is_open())
{
cout << "Fail at point: " << filecount << endl;
return 1;
}
fsWriteFiles << filecontent;
}
是的,你每次循环都在'构造'ofstream对象,但我发现这段代码更易于维护。
答案 3 :(得分:1)
只是想确保您了解boost::filesystem。它可能会大大简化您的代码。
#include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
#include <iostream> // for std::cout
using boost::filesystem; // for ease of tutorial presentation;
// a namespace alias is preferred practice in real code
path my_path( "some_dir/file.txt" );
remove_all( "foobar" );
create_directory( "foobar" );
ofstream file( "foobar/cheeze" );
file << "tastes good!\n";
file.close();
if ( !exists( "foobar/cheeze" ) )
std::cout << "Something is rotten in foobar\n";
答案 4 :(得分:0)
您有以下内容:
char charpart1[3] = "";
randomStore = rand() % 255;
sprintf(charpart1, "%.2x", randomStore);
您的意思是使用“%.2f”格式而不是x吗? %。2x仍打印“3ff3c083”,它会溢出缓冲区。此外,您可能希望charpart1的大小为5,而不是3,如果切换到%0.2f,因为它会写[0] [。] [2] [3] [\ 0](例如)。