c – 我们如何将一个100 GB的文件分割成100个1 GB的文件?

当我试图解决 this问题时,我想到了这个问题.

我的硬盘容量为120 GB,其中100 GB占用了一个巨大的文件.所以20 GB仍然是免费的.

我的问题是,我们如何将这个巨大的文件分割成较小的文件,每个文件大小为1 GB?我看到,如果我有〜100 GB的可用空间,可能是简单的算法.但只有20GB的可用空间,我们可以编写20个1GB的文件.我不知道如何从阅读时从较大的文件删除内容.

任何解决方案?

一旦完成了一个文件的编写,似乎我将文件截断1 GB,但是归结为这个任务:

是否可以截断文件的一部分?怎么样

我想看一个在C或C(最好是标准C和C)中运行的算法(或一个算法的轮廓),所以我可以知道较低级别的细节.我不是在寻找可以做这项工作的魔术功能,脚本或命令.

解决方法

根据 this question (Partially truncating a stream),您应该可以在符合POSIX的系统上使用调用 int ftruncate(int fildes,off_t length)来调整现有文件的大小.

现代实现可能会将文件“已修改”(尽管在文档中未指定).唯一可以理解的是,您可能需要做一些额外的工作才能确保off_t是64位类型(POSIX标准中存在32位off_t类型).

您应该采取措施来处理错误条件,以防万一因为某些原因而失败,因为显然,任何严重故障都可能导致您的100GB文件丢失.

代码(假设并采取措施确保所有数据类型足够大以避免溢出):

open (string filename) // opens a file,returns a file descriptor
file_size (descriptor file) // returns the absolute size of the specified file
seek (descriptor file,position p) // moves the caret to specified absolute point
copy_to_new_file (descriptor file,string newname)
// creates file specified by newname,copies data from specified file descriptor
// into newfile until EOF is reached

set descriptor = open ("MyHugeFile")
set gigabyte = 2^30 // 1024 * 1024 * 1024 bytes

set filesize = file_size(descriptor)
set blocks = (filesize + gigabyte - 1) / gigabyte

loop (i = blocks; i > 0; --i)
    set truncpos = gigabyte * (i - 1)
    seek (descriptor,truncpos)
    copy_to_new_file (descriptor,"MyHugeFile" + i))
    ftruncate (descriptor,truncpos)

显然,这个伪代码中的一些类似于标准库中发现的函数.在其他情况下,您必须自己编写.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...