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) 显然,这个伪代码中的一些类似于标准库中发现的函数.在其他情况下,您必须自己编写. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |