Лучший способ перебрать много файлов и заархивировать каждый отдельно? - PullRequest
1 голос
/ 30 июня 2011

Мне нужно перебрать относительно большой набор файлов (> 5000), архивировать и выгружать каждый отдельно (не в виде каталогов или групп файлов) на сервер по очереди.

Самая большая часть моей проблемы заключается в том, чтобы узнать, какой способ архивирования является лучшим с точки зрения простоты реализации и производительности. Я думал, что должна быть стандартная структура Какао для чего-то, что, по-видимому, является очень распространенным требованием, но, похоже, такой структуры не существует. Другие предложения и подходы, которые я нашел до сих пор:

  • zip.framework на code.google.com, который "представляет собой инфраструктуру какао для удобного перечисления, чтения и записи zip-файлов. Основная цель этой платформы - предотвратить использование команды линейные утилиты в вашем приложении, предоставляя собственный интерфейс Какао "- кажется, многие нашли эту ссылку (но я не заметил никого, кто действительно использовал ее раньше!)
  • ziparchive также на code.google.com - "основано на открытом исходном коде" MiniZip "".
  • Предложения по использованию NSTask для вызова утилит командной строки, таких как ditto , распространены, как, например, в этом вопросе CocoaDev , но мне не нравится идея делать он
  • Аналогично, кто-то здесь предложил NSTask позвонить zip и unzip - но эта публикация говорит, что «единственная проблема заключается в том, что когда файлы После распаковки заголовки Mac были удалены, поэтому Mac OS не распознает файл !! (т. е. я заархивирую приложение, и оно удаляет «appl» из файла. Когда я распаковываю его, он непригоден для использования. "
  • Чей-то фреймворк под названием ZipKit здесь
  • Другой вопрос CocoaDev обсуждает несколько подходов, например, создание оболочки для кода архивирования C ++, создание оболочки C для zlib и minizip (minizip построен на основе zlib) и т. д.
  • Что-то о NSDataCategory (не понял)
  • Средство чтения манги / комиксов (!) С открытым исходным кодом от www.feedface.com, которое называется FFView и имеет собственную отдельную структуру архивирования

Заархивированные файлы необходимо разархивировать в Windows.

Пожалуйста, я надеюсь, что кто-то имеет реальный опыт работы с решением, которое соответствует моим требованиям. Как вы можете видеть, я уже нашел много ссылок, поэтому просто еще одна ссылка на другой фреймворк / подход без чего-то, что фактически указывает на его применимость к моей проблеме, на самом деле не будет очень полезна.

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Это то, что я считаю «правильным способом какао» для этого.Возможно, вам это не понравится, но это работает, для этого не требуются внешние фреймворки и очень мало кода.

Добавьте сценарий оболочки в комплект приложений, 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.

1 голос
/ 30 июня 2011

Если вы работаете с Linux, я бы использовал скрипт оболочки с несколькими инструментами (zip, lftp и, возможно, find). Затем вы можете сжать все файлы и загрузить их, просто запустив скрипт. Я мог бы помочь вам с таким решением.

Или это требование для реализации инструмента сжатия на C или C ++ с использованием библиотек, которые вы упомянули?

Обновление

Почему Unicode важен для вашей проблемы? Из-за имен файлов?

Вы можете решить эту проблему, написав оболочку для преобразования имен файлов в кодировка latin1 и хранение небольшого текстового файла вместе со сжатым файлом.

Что касается эффективности, возможно, вы можете провести некоторое исследование и выяснить, какой алгоритм лучше, а затем искать библиотеку, поддерживающую его. Насколько я знаю, сжатие zip основано на lz77 или lzw: вы можете даже где-то найти его и реализовать самостоятельно, это не должно быть очень сложно, если вы хотите сжать отдельные файлы, потому что вы только Нужно реализовать базовый алгоритм и применить его к потоку байтов. Смотрите, например http://en.pudn.com/downloads33/sourcecode/zip/detail106575_en.html, http://rosettacode.org/wiki/LZW_compression

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...