Я работаю над программой, которая создает 2000 каталогов и помещает файл в каждый (всего файл размером 10 КБ или около того). Я использую mkdir для создания каталогов и 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-значный шестнадцатеричный каталог из случайного числа, а затем сохраняет файл в этом каталоге. Он завершается с ошибкой в точке (я добавил cout) после записи 1000 файлов. Это указывает на то, что он не может создать файл, но должен уже проверить, что файл не существует. Иногда он терпит неудачу на 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();
}
}
}