Փորձում եմ ծրագիր գրել կոշտ սկավառակը ֆայլերով լցնելու համար։ Դա սկավառակի հուսալիությունը ստուգելու համար է: Ես գրում եմ ֆայլ, կարդում եմ, որ ստուգեմ դրա պարունակությունը և առաջ շարժվում, մինչև սկավառակը լցվի:
Բայց այն ֆունկցիան, որը ես օգտագործում եմ սկավառակի ազատ տարածությունը ստանալու համար, վերադարձնում է նույն արժեքը, երբ այն զանգում ես օղակով: Ես փնտրեցի ամենուր, բայց չգտա այս հարցի պատասխանը։
Երևույթը ցույց տալու համար մի պարզ ծրագիր գրեցի.
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;
}
Եվ ահա 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;
Արդյո՞ք ես ճիշտ չեմ օգտագործում գործառույթը: Ես բացարձակապես պատկերացում չունեմ, թե ինչ կարող է դա առաջացնել: Ես նման բան ունեմ գրված c#-ով, այն օգտագործում է DriveInfo դասը և այս խնդիրը չկա: