【问题标题】:GetDiskFreeSpaceEx, free space not changing despite creating filesGetDiskFreeSpaceEx,尽管创建文件,可用空间不改变
【发布时间】:2014-10-13 21:31:19
【问题描述】:

我正在尝试编写一个程序来用文件填充硬盘驱动器。这是为了测试驱动器的可靠性。我写了一个文件,读取它以检查其内容,然后继续前进,直到驱动器已满。

但是当你在循环中调用它时,我用来获取驱动器可用空间的函数返回相同的值。我到处寻找,但找不到这个问题的答案。

我写了一个简单的程序来展示这个现象。

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 类,这个问题不存在。

【问题讨论】:

标签: c++ winapi diskspace


【解决方案1】:

尝试改用 freeBytesTotal。

【讨论】:

  • 它给出了相同的结果,但我找到了答案。看我的回答。
【解决方案2】:

抱歉,Hans Passant 是对的,这是一个非常简单的错误。代码会用相同大小的文件覆盖文件,因此可用空间从未改变。

作为记录,freeBytesUser 和 freeBytesTotal 都给了我相同的结果。这是在 Windows 7 64 位上完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2017-09-16
    • 2016-09-08
    • 2012-07-27
    • 2020-01-31
    • 1970-01-01
    • 2019-11-10
    • 2019-06-20
    相关资源
    最近更新 更多