Я пытаюсь написать программу для заполнения жесткого диска файлами. Это проверить надежность привода. Я пишу файл, читаю его, чтобы проверить его содержимое, и продолжаю, пока накопитель не заполнится.
Но функция, которую я использую для получения свободного места на диске, возвращает то же значение, когда вы вызываете его в цикле. Я посмотрел везде, но не смог найти ответ на этот вопрос.
Я написал простую программу, чтобы показать это явление.
int main()
{
for (int i = 0; i < 3; ++i)
{
write128MBFile("F:\\test\\fill\\" + to_string(i));
cout << getFreeSpace("F:\\test\\fill") << endl;
}
}
Возвращает
1 //Meaning that GetDiskFreeSpaceEx was successful
229311180800 //The amount of free bytes left
1
229311180800
1
229311180800
Я подтвердил, что файлы были написаны. Свободное место на диске даже корректно обновляется в меню свойств диска.
Вот getFreeSpace
код:
static unsigned __int64 getFreeSpace(const char* dir)
{
ULARGE_INTEGER freeBytesUser;
ULARGE_INTEGER bytes;
ULARGE_INTEGER freeBytesTotal;
int i = GetDiskFreeSpaceEx(dir,&freeBytesUser,&bytes,&freeBytesTotal);
cout << i << endl;
return freeBytesUser.QuadPart;
}
А вот код записи 128MBFile:
void write128MBFile(string fileName)
{
int fileSize = 1024*1024*128;
int parts = 8;
int partSize = fileSize / parts;//Buffer of about 16MB
char c = 33;
ofstream outfile;
outfile.open(fileName, ios::binary | ios::trunc);
for (int i = 0; i < parts; i++)
{
char *partToWrite = new char[partSize + 1];
partToWrite[partSize] = '\0';
for (int j = 0; j < partSize; j++)
{
partToWrite[j] = c;
}
outfile << partToWrite;
outfile.flush();
delete partToWrite;
}
outfile.close();
}
Не могу забыть о том, что включает в себя:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
using namespace std;
Я не правильно использую эту функцию? Я понятия не имею, что может быть причиной этого.
У меня есть что-то похожее написано в C #, он использует класс DriveInfo и этой проблемы нет.
Попробуйте вместо этого использовать freeBytesTotal.
Извините, ребята, Ганс Пассант был прав, это была очень простая ошибка. Код перезаписывал файлы одинаковыми по размеру, поэтому свободное пространство никогда не менялось.
Для справки, и freeBytesUser, и freeBytesTotal дают одинаковые результаты. Это было сделано на Windows 7 64 бит.