gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:06:32 26 4
gpt4 key购买 nike

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

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

  • zip.framework在 code.google.com,它“是一个可轻松列出、读取和写入 zip 文件的 Cocoa 框架。该框架的主要目的是通过提供 native Cocoa 接口(interface)来防止您在应用程序中使用命令行实用程序” - 似乎很多人都找到了这个链接(但我没有注意到有人以前实际使用过它!)
  • ziparchive也在 code.google.com -“基于开源代码‘MiniZip’”。
  • 有关使用 NSTask 调用命令行实用程序(例如 ditto)的建议很常见,例如此 CocoaDev question但我不喜欢必须这样做的想法
  • 同样,这里有人建议 NSTask 调用 zipunzip - 但这 posting说“唯一的问题是,当文件解压缩时,Mac header 已被剥离,因此Mac操作系统无法识别该文件!(即我压缩一个应用程序,它会从文件中剥离“appl”。当我解压它,它无法使用。”
  • 某人的框架名为ZipKit here
  • Another CocoaDev question讨论了几种方法,例如为 C++ 归档代码创建包装器、为 zlibminizip 创建 C 包装器(minizip 是围绕 zlib 构建的)等
  • 有关 NSDataCategory 的信息(没听懂)
  • 来自 www.feedface.com 的开源漫画/漫画书阅读器(!),名为 FFView它有自己独立的 archiving framework

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

拜托,我希望有人拥有满足与我类似要求的解决方案的实际经验。正如您所看到的,我已经找到了很多链接,因此仅仅指向另一个框架/方法的另一个链接,而没有实际表明其对我的问题的适用性并不会真正有帮助。

谢谢!

最佳答案

这就是我认为的“正确的 cocoa 方式”。您可能不喜欢它,但它确实有效,不需要外部框架,并且需要很少的代码。

将 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;

您可能会对此类事情犹豫不决,但将此类任务委托(delegate)给单独的流程是稳健且相当标准的。

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

waitUntilExit 的调用将导致您的应用程序卡住或“沙滩球”,除非您在单独的线程中运行整个过程,或者对 Unix IPC 有足够的了解来处理 SIGCHLD。

关于objective-c - 循环浏览大量文件并分别压缩每个文件的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com