Это то, что я считаю «правильным способом какао» для этого.Возможно, вам это не понравится, но это работает, для этого не требуются внешние фреймворки и очень мало кода.
Добавьте сценарий оболочки в комплект приложений, 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
И затем, в Какао,
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;
Вы можете отказаться от такого рода вещей, но делегирование такого рода задачи отдельному процессу является надежным и довольно стандартным.
Если имена файловможет иметь пробелы, вам придется немного изменить скрипт оболочки;Я подумал о написании «безопасной» версии, но это более читабельно.Вы также можете сделать индикатор выполнения, повторив вывод скрипта, который будет прочитан приложением.
Вызов waitUntilExit
приведет к зависанию вашего приложения или «пляжному мячу», если вы не запустите все это вотдельный поток или достаточно информации о Unix IPC для обработки SIGCHLD.