循环浏览大量文件并分别压缩每个文件的最佳方法?

时间:2011-06-29 22:02:06

标签: objective-c cocoa macos

我需要遍历一组相对较大的文件(> 5000),将每个单独压缩(而不是作为目录或文件组)依次压缩和上传到服务器。

我的问题的最大部分是知道哪个是在易于实现和性能方面进行压缩的最佳方式。我认为必须有一个标准的Cocoa框架,这显然是一个非常常见的要求,但似乎没有任何这样的框架。到目前为止我发现的其他建议和方法:

    code.google.com上的
  • zip.framework,“这是一个简单的zip文件列表,读取和写入的可可框架。此框架的主要目的是防止您必须使用命令行实用程序应用程序通过提供本机Cocoa接口“ - 似乎很多人都找到了这个链接(但我没有注意到之前曾经使用过它的人!)
  • ziparchive也位于code.google.com - “基于开源代码'MiniZip'”。
  • 有关使用NSTask调用命令行实用程序(例如 ditto )的建议很常见,例如在CocoaDev question中,但我不喜欢这样做的想法它
  • 同样,此处有人建议NSTask拨打压缩解压缩 - 但此posting表示“唯一的问题是文件被解压缩,Mac标题已被剥离,因此Mac OS无法识别文件!!(即我压缩了一个应用程序并从文件中删除了“appl”。当我解压缩它时,它无法使用。“< / LI>
  • 某人的框架名为 ZipKit here
  • Another CocoaDev question讨论了几种方法,例如为C ++归档代码创建包装器,为 zlib minizip 创建C包装器(minizip围绕zlib构建)等等。
  • 关于NSDataCategory的某些事情(不明白)
  • 来自www.feedface.com的开源漫画/漫画阅读器(!),名为FFView,有自己独立的archiving framework

压缩文件需要在Windows中解压缩。

拜托,我希望有人能够获得满足我类似要求的解决方案的实际经验。正如您所看到的,我已经找到了很多链接,所以只是另一个链接到另一个框架/方法而没有实际表明它对我的问题的适用性并不会真正有用。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您正在使用Linux,我会使用带有一些工具(zip,lftp和find)的shell脚本。然后,您可以压缩所有文件,然后通过运行脚本上传。 我可以帮你解决这个问题。

或者是否要求使用您提到的库在C或C ++中实现压缩工具?

<强>更新

为什么Unicode与您的问题相关?因为文件名?

您可以通过编写包装器将文件名转换为来解决此问题 latin1编码,并将一个小文本文件与压缩文件一起存储。

关于效率,也许你可以做一些研究,找出最好的算法是什么,然后找一个支持它的库。据我所知,zip压缩基于lz77或lzw:你甚至可以在某处查找并自己实现, 如果你想压缩单个文件,那应该不是很难 需要实现基本算法并将其应用于字节流。 参见例如http://en.pudn.com/downloads33/sourcecode/zip/detail106575_en.htmlhttp://rosettacode.org/wiki/LZW_compression

答案 1 :(得分:1)

这就是我认为“适当的可可方式”。您可能不喜欢它,但它可以工作,它不需要外部框架,而且只需要很少的代码。

将shell脚本添加到应用程序包zipmany.sh

#!/bin/bash
set -e
SRC="$1"
DEST="$2"
cd "$SRC"
for FILE in $(find . -not -name '.*' -a type f)
do
    zip -jD "$DEST"/"$FILE".zip "$FILE"
done

然后,在Cocoa,

NSString *script = [[NSBundle mainBundle] pathForResource:@"zipmany" ofType:@"sh"];
NSTask *task = [[NSTask alloc] init];
[task setArguments:[NSArray arrayWithObjects:@"zipmany.sh", srcDir, destDir, nil]];
[task launch];
[task waitUntilExit];
if ([task terminationReason] == ATASK_SUCCESS_VALUE)
    succeeded;
else
    failed;

你可能会对这种东西犹豫不决,但是将这种任务委托给一个单独的过程是健壮且相当标准的。

如果文件名可以包含空格,则必须稍微更改shell脚本;我考虑过编写“安全”版本,但这更具可读性。您还可以通过回显应用程序读取的脚本输出来创建进度条。

waitUntilExit的调用会导致你的应用程序冻结或“乱弹”,除非你在一个单独的线程中运行整个事情,或者对Unix IPC有足够的了解处理SIGCHLD。