2

如何在不复制到新文件的情况下将文件合并为一个?
资料来源:我有 file.dd.001、file.dd.002、file.dd.003、file.dd.004 ...
任务:我有 600 个文件(1.5 Gb)。所有这些文件的容量:大约 900 GB。硬盘容量:1.5 TB。我无法使用 Total Commander 或 7-zip 或 WinRAR 加入这些文件,因为硬盘容量无法复制到新文件中(可用空间不足)。
需要:加入文件,可能会执行多次程序,但是:
1)加入 100 个第一个文件(150 GB)。删除拆分的文件(前 100 个)。
2) 将接下来的 100 个文件加入到此合并文件 (150 GB)中。删除这 100 个文件。
3) 将下 100 个文件加入合并文件 (300 GB)...
问题:谁能告诉我如何将文件合并(加入)到新的越来越大的文件中?也许软件存在,或者是用 C# 代码解决这个问题的最后机会。有任何想法吗

4

3 回答 3

4

自己写吧。

打开文件#1。寻求结束。打开文件#2,开始读取内容并附加到文件#1。

完成后,删除文件#2,然后继续处理文件#3。

在合理的脚本语言中应该小于 10 行。

我不了解 Windows,但在 unix 上你可以这样做:

for num in `seq -w 2 600`; do
    cat file.dd.$num >> file.dd.001
    rm file.dd.$num
done

注意附加>>输出重定向的使用。

您可能可以通过使用dd而不是加快速度cat,它应该使用零拷贝传输(即让内核完成工作,而不是将文件读入内存并将其写入输出流)。

 dd if=file.dd.$num of=file.dd.001 conv=notrunc oflag=append bs=10M

这应该让你接近你的硬盘可以在 IO 上提供的任何东西。

于 2012-09-09T12:51:08.270 回答
1

感谢@Anony-Mousse 提供了有用的 Linux 代码示例
问题已经解决了……<br/> Windows 有 cmd 命令,我在Harlan Harvey 所著的 Windows Forensic Analysis Dvd Toolkit 2E (2009)一书中找到了该命令。448:

D:\Images>type image.001 >  image_all.img
D:\Images>type image.002 >> image_all.img
D:\Images>type image.002 >> image_all.img

如果我有文件 300 Gb ( image_all.img ),我需要加入 50 个文件 (1,5 Gb),我需要:

D:\Images>type image.200 >> image_all.img
D:\Images>type image.201 >> image_all.img
D:\Images>type image.202 >> image_all.img
D:\Images>type image.203 >> image_all.img
….
D:\Images>type image.498 >> image_all.img
D:\Images>type image.499 >> image_all.img

或更好:

D:\Images>type image.* >> image_all.img

并将文件夹中的所有文件(带掩码)连接到文件image_all.img

于 2012-09-13T14:11:54.850 回答
0

我假设您想合并这些文件以简化处理,对吧?如果这是您的目标,那么更有效的方法是使用 FIFO 文件。在 *nix(linux、macos、*bsd 等)上,您可以使用 mkfifo 命令创建一个“表示”所有文件的 FIFO 文件,如下所示:

mkfifo mybigfile
cat file.dd.* > mybigfile &
{{process}} mybigfile

mybigfile文件将包含您的 file.dd.{001,002,003...} 文件的所有内容,您可以将所有这些文件作为一个大文件处理。一旦您的进程完成读取文件,mybigfile将是空的,要“重新填充”它,您需要执行“ cat file.dd.* > mybigfile & ”命令

现在,原始问题包含许多微软 Windows 参考(C#、w​​inrar 和总指挥官),所以我认为作者需要一个 Windows 解决方案。我不是 Windows 人,但我相信以上内容可以在 cygwin 下或通过使用命名管道和 PowerShell 使用(但我可能完全错了)

于 2017-02-04T12:26:09.573 回答