如何将一个100 GB的文件拆分为100个1 GB的文件?

Naw*_*waz 10 c c++ algorithm file hard-drive

当我试图解决这个问题时,脑海中浮现出这个问题.

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

我的问题是,我们如何将这个巨大的文件拆分成较小的文件,比如每个1 GB?我看到如果我有大约100 GB的可用空间,可能只需要简单的算法就可以了.但是只有20 GB的可用空间,我们可以写入多达20个1GB的文件.我不知道如何从大文件中删除内容.

有解决方案吗

看起来我要将文件截断1 GB,一旦我写完一个文件,但归结为这个问题:

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

我想看一个在C或C++(最好是标准C和C++)中工作的算法(或算法大纲),所以我可能知道较低级别的细节.我不是在寻找可以完成这项工作的神奇功能,脚本或命令.

huy*_*itw 5

这项工作没有标准功能.

对于Linux,您可以使用ftruncate方法,而对于Windows,您可以使用_chsizeSetEndOfFile.一个简单的#ifdef将使它跨平台.另请阅读问答.

  • @Nawaz:没有标准的C++工具允许您跨平台可靠地执行此操作.你需要依赖特定于os的函数,比如`_chsize`和`ftruncate`,或者依赖于第三方库,比如`boost :: filesystem`,它们包含那些函数调用.至少直到`filesystem`被采纳到标准中,这应该很快. (2认同)

Wug*_*Wug 5

根据这个问题(部分截断流),您应该能够在符合POSIX的系统上使用调用int ftruncate(int fildes, off_t length)来调整现有文件的大小.

现代实现可能会"就地"调整文件大小(尽管文档中未指定).唯一的问题是您可能需要做一些额外的工作以确保它off_t是64位类型(对于32位off_t类型,POSIX标准中存在规定).

您应该采取措施来处理错误情况,以防万一由于某种原因失败,因为很明显,任何严重的故障都可能导致丢失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)
Run Code Online (Sandbox Code Playgroud)

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

  • 除了你的答案,如果它还不是很明显,我建议开发人员在真正的交易之前在另一个系统上进行TEST RUN,以确保他们的代码中没有愚蠢的错误...当你只有一个拍摄它,你想确保你不要错过.=) (2认同)