2014-10-13 7 views
0

Я пытаюсь написать программу для заполнения жесткого диска файлами. Это испытание надежности привода. Я пишу файл, читаю его, чтобы проверить его содержимое и двигаться дальше, пока диск не будет заполнен.GetDiskFreeSpaceEx, свободное пространство не меняется, несмотря на создание файлов

Но функция, которую я использую для получения свободного пространства диска, возвращает то же значение, когда вы вызываете его в цикле. Я везде искал, но не мог найти ответа на этот вопрос.

Я написал простую программу, чтобы показать явление.

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 «S:

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; 
} 

А вот код write128MBFile в:

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; 

Am Я не использую функция правильно? Я совершенно не знаю, что может быть причиной этого. У меня что-то подобное написано в C#, оно использует класс DriveInfo, и этой проблемы нет.

+0

Это странно, у вас есть пользовательские квоты для вашего тома? –

+0

Возможный дубликат: http://stackoverflow.com/questions/627131/getdiskfreespaceex-reports-wrong-number-of-free-bytes – Ilya

+2

Вы должны удалить содержимое каталога перед началом работы :) –

ответ

0

Извините, ребята, Ханс Пассент был прав, это была очень простая ошибка. Код переписывал файлы с теми, которые были одного размера, поэтому свободное пространство никогда не менялось.

Для записи, как freeBytesUser, так и freeBytesTotal дают мне те же результаты. Это было сделано на Windows 7 64 бит.

0

Попробуйте вместо этого использовать freeBytesTotal.

+0

Он дает тот же результат, но я нашел ответ. См. Мой ответ. – thyrokio

Смежные вопросы