在C:驱动器(OS驱动器)中创建最大大小的文件失败

时间:2014-08-26 14:23:27

标签: c windows winapi file-io privileges

我开发了一个磁盘和文件擦除软件(使用WIN32 api),它还包含擦除驱动器可用空间的选项。我这样做是通过创建一个大小为驱动器可用空间的文件,然后在该文件上写随机字节(应用各种标准擦除方案)。

我的问题是它在所有其他驱动器上运行良好,除了安装了Windows操作系统的驱动器(在我的情况下,它是C :)。它提供了“没有足够的磁盘空间”错误,尽管所述驱动器有大量可用空间。我的程序以管理权限运行。是某种特权问题吗?即使在与管理员一起运行之后,我还需要为我的程序提供更多权限吗?我想用winapi以编程方式进行。

我主要在NTFS文件系统上测试。我正在使用CreateFile winapi调用创建文件,并确保创建精确大小的文件等于可用空间,我使用碎片api获取可用空间,然后使用SetEndOfFile winapi方法扩展文件的大小。 任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

Windows无法很好地处理磁盘空间不足,因此如果系统保留一些普通用户的磁盘空间,即使管理员无法使用,也不会让我感到惊讶。但无论这是否真实,您的方案都存在缺陷。在您找到空闲空间并尝试分配所有空间之间,分配的空间量很容易变化。即使它起作用,事情可能会开始破碎,因为磁盘已满,即使只是一段时间。

由于您已经在使用碎片整理API,因此我会使用它来擦除磁盘上的所有群集,而不会尝试将它们全部分配一次。首先创建一个填满大部分磁盘空间的文件,但为其他进程分配文件留出足够的空间。然后使用FSCTL_GET_VOLUME_BITMAP获取未分配扇区的位图,并使用FSCTL_MOVE_FILE将群集从您创建的文件移动到位图中找到的自由聚类中。您需要准备好让FSCTL_MOVE_FILE失败,因为有些内容已经分配了一个标记为空闲的群集。在这种情况下,我会将你一次移动的集群数量减半,直到它工作为止。如果它只有一个集群失败,那么你知道它已经被分配了集群(或其中一个集群)。

像这样的伪代码:

// unalloc_start and unalloc_len describe an unallocated region in the free space bitmap
wipe_unallocated_clusters(hwipefile, unalloc_start, unalloc_len, max_chunk_len) {
    unalloc_vcn = unalloc_start
    unalloc_end = unalloc_start + unalloc_len
    max_chunck_len = max(max_chunk_len, unalloc_len)
    clen = max_chunk_len
    while(unalloc_vcn < unalloc_end) {
        clen = max(clen, unalloc_end - unalloc_vcn)
        while (fsctl_move_file(hwipefile, 0, unalloc_vcn, clen) == FAILED) {
            if (clen == 1) {
                unalloc_vcn++   // skip over allocated cluster
                continue
            }
            clen /= 2  // try again with half as many clusters
        }
        unalloc_vcn += clen
        clen = max(clen * 2, max_chunk_len)  // double the clusters if it worked
    }
}

答案 1 :(得分:-1)

看到一些失败的代码和具体值会很好,但我会尝试使用我的心灵力量。我有两个理论。

1)您的文件大小超过C:上文件系统的最大文件大小。 FAT16最高支持2GB,FAT32最多支持4GB文件。

2)根目录中有太多文件。有一些报告称Windows FAT32实现仅支持根目录中的1000个文件条目。