当我试图解决
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)