c++ - 我们如何将一个 100 GB 的文件拆分成一百个 1 GB 的文件?

标签 c++ c algorithm file hard-drive

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

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

我的问题是,我们如何将这个巨大的文件拆分成较小的文件,比如每个 1 GB?我看到如果我有大约 100 GB 的可用空间,可能可以使用简单的算法。但是如果只有 20 GB 的可用空间,我们最多可以写入 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++ - 我们如何将一个 100 GB 的文件拆分成一百个 1 GB 的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15940150/

相关文章:

c++ - 返回你自己内部拷贝的正确方法是什么?

c++ - 避免拒绝服务攻击

python - 问题获取最大子数组的开始

确定可分解为 2^p5^q 的数字集的算法

生成网络的算法,该网络用源、水平线、直角、T 形接头和节点填充 10x10 网格?

c++ - 如何在已经使用适用于 C++ 的 Google Play 游戏服务 SDK 实现排行榜的情况下创建 Google+ Plus One 按钮?

c++ - 如何在 Visual C++ 2005 中创建带有行号的映射文件?

c++ - std 集合上的 CPPUNIT_ASSERT_EQUAL

c - 用C归档/添加数据

c - 如何在 C 中将一个字符串分成多个其他特定长度的字符串?