在Windows上连接文件,并进行反向操作

时间:2011-10-26 23:05:54

标签: windows file file-io tar

我目前正在尝试找到一种方法来连接几个文件,通常是目录中的所有文件(包括递归)到单个流中,以便进一步处理。 TAR看起来是一个明显的候选者,除了它在Windows中根本不是标准的,不幸的是,我能找到的所有版本(主要是GNU TAR的变体)都太大了(几百KB曾经包含DLL依赖项)。我需要更小的东西。

显然,标准COPY命令可以解决问题。例如,以下命令有效: COPY / B sourcefile1 + sourcefile2 destinationfile

但是,仍有2个问题:我不知道如何将结果写入stdout(for pipe),更重要的是如何实现反向操作?

我需要一个小实用程序来执行此连接作业,可以是C源代码,标准Windows命令,也可以是可分发的二进制文件。它不需要尊重TAR格式(尽管它确实不是坏事)。显然,连接应该是可逆的。

3 个答案:

答案 0 :(得分:2)

我建议使用7-zip。它有portable版本,可以非常好地压缩(或者只是复制而不压缩)所有文件都会递归子目录并将输出写入单个流(stdout)。

它具有“-so”(向stdout写入数据)开关。例如,

7z x archive.gz -so > Doc.txt

将archive.gz存档解压缩为输出流,然后将该流重定向到Doc.txt文件。

7z a -tzip -so -r src\*.cpp src\*.h > archive.zip 

将src目录中的所有* .cpp-和* .h-文件及其所有子目录压缩为7-Zip标准输出流,并将该流写入archive.zip文件(删除“> archive.zip”和拦截你的程序输出。)

答案 1 :(得分:1)

为什么不使用ZIP(如果需要,禁用压缩)?它非常标准,Windows内置了支持。见Creating a ZIP file on Windows (XP/2003) in C/C++

纯级联是不可逆的,因为你无法知道在哪里再次拆分它。因此,您应该使用块大小的目录,例如以ZIP和TAR格式存在。

答案 2 :(得分:0)

好吧,谢尔文几乎解决了这个问题。 他提出的Tar版本是“瘦弱的”(~120KB)并且不需要外部DLL依赖性。 http://downloads.sourceforge.net/project/unxutils/unxutils/current/UnxUtils.zip

不幸的是,它也有一些问题,例如不支持Unicode字符,解释转义序列(所以以t开头的目录名触发了一个被认为是制表的\ t),以及管道的潜在问题在Windows XP下实现(虽然最后一个可能来自其他程序)。 所以这是一个死胡同。

仍有待解决方案......

[编辑] Shelwien刚刚提供了一个解决方案,创建了“shar”,一种更小,更高效的焦油替代品,没有上述限制。这解决了这个问题。