在 Windows 上连接文件,并反向操作
Posted
技术标签:
【中文标题】在 Windows 上连接文件,并反向操作【英文标题】:Concatenate files on Windows, and reverse operation 【发布时间】:2011-10-26 23:05:54 【问题描述】:我目前正在尝试找到一种方法将多个文件(通常是目录中的所有文件(包括递归))连接到单个流中,以进行进一步处理。 TAR 看起来像是一个明显的候选者,除了它在 Windows 中根本不是标准的,而且不幸的是,我能找到的所有版本(主要是 GNU TAR 的变体)都太大了(数百 KB 曾经包含 DLL 依赖项)。我需要更小的东西。
显然,标准的 COPY 命令可以解决问题。例如以下命令有效: COPY /B 源文件1+源文件2 目标文件
但是,还有两个问题:我不知道如何将结果写入stdout(用于管道),更重要的是如何实现反向操作?
我需要一个小型实用程序来执行此连接工作,可以是 C 源代码、标准 Windows 命令,也可以是可分发的二进制文件。它不需要尊重 TAR 格式(尽管这样做也不是坏事)。显然串联应该是可逆的。
【问题讨论】:
【参考方案1】:我建议使用 7-zip。它有portable 版本,可以很好地压缩(或者只是复制而不压缩)所有文件递归子目录并将输出写入单个流(stdout)。
它有“-so”(将数据写入标准输出)开关。例如,
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" 并拦截由您的程序输出)。
【讨论】:
有趣。 7z 的 v4.65 为 150KB,而 v9.20 为 585KB。差别很大,所以我会坚持使用 v4.65。尽管 150KB 和成熟的压缩器对于简单的串联功能来说似乎有点过头了,但这个解决方案似乎是迄今为止最好的。 嗯,由于某种原因,它不起作用。使用 -so 写入标准输出总是会导致提及“未实现”。 @Cyan:有一个开发人员 API 和库设计用于您自己的代码,我想它会更小,并且比构建命令行和捕获孩子的标准输出更容易使用过程。 @Cyan:有一点,是的。我正在基于它构建一个 .NET 程序集……构建它但从来没有足够的时间编写适当的 C# 友好的包装器。 不幸的是,虽然我可以“按原样”下载和编译源代码,生成与提议的等效的二进制文件,但我无法深入研究无数的源文件来找到我需要的正确功能(这只是连接)。【参考方案2】:为什么不使用 ZIP(如果需要,请禁用压缩)?它非常标准,并且支持内置在 Windows 中。见Creating a ZIP file on Windows (XP/2003) in C/C++
纯串联是不可逆的,因为您不知道在哪里再次拆分它。因此,您应该使用块大小的目录,例如存在于 ZIP 和 TAR 格式中。
【讨论】:
是的,确实如此。 COPY 直接连接文件内容,没有其他信息。所以检索原始文件(名称、大小等)是不可能的。【参考方案3】:嗯,Shelwien 几乎解决了这个问题。 他提出的 Tar 版本“足够精简”(~120KB)并且不需要外部 DLL 依赖。 http://downloads.sourceforge.net/project/unxutils/unxutils/current/UnxUtils.zip
不幸的是,它本身也有一些问题,例如不支持 Unicode 字符、解释转义序列(因此以 t 开头的目录名称会触发被视为制表的 \t)以及管道的潜在问题在 Windows XP 下实现(尽管在最后一个它可能来自另一个程序)。 所以这是一个死胡同。
还有待解决……
[编辑] Shelwien 刚刚通过创建“shar”提供了一个解决方案,这是一个更小、更高效的 tar 替代品,没有上述限制。这样就解决了问题。
【讨论】:
这里是link to shar 给感兴趣的人。以上是关于在 Windows 上连接文件,并反向操作的主要内容,如果未能解决你的问题,请参考以下文章