当我试图解决this问题时,我想到了这个问题。
我的容量为120 GB的硬盘,其中100 GB由一个巨大的文件占用。所以20 GB仍然是免费的。
我的问题是,我们如何将这个巨大的文件拆分成较小的文件,比如每个1 GB?我看到如果我有大约100 GB的可用空间,可能只需要简单的算法就可以了。但是只有20 GB的可用空间,我们可以写入多达20个1GB的文件。我不知道如何从大文件中删除内容。
任何解决方案?
在我写完一个文件后,似乎我要将文件截断1 GB,但这归结为这个问题:
是否可以截断文件的一部分?究竟是怎么回事?
我希望看到算法(或算法大纲)在C或C ++(最好是标准C和C ++)中工作,所以我可能知道更低级别的细节即可。我不是在寻找可以完成这项工作的神奇功能,脚本或命令。
答案 0 :(得分:5)
这项工作没有标准功能。
对于Linux,您可以使用ftruncate方法,而对于Windows,您可以使用_chsize或SetEndOfFile。一个简单的#ifdef
将使其跨平台。
另请阅读this Q& A。
答案 1 :(得分:5)
根据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)
显然,这些伪代码中的一些类似于标准库中的函数。在其他情况下,您必须自己编写。