2009-09-23 6 views
5

Ich habe einige Ressourcen (gezippt), die mit meiner iPhone-Anwendung geliefert werden müssen. Wenn die App zum ersten Mal gestartet wird, muss diese gezippte Datei in den Ordner Dokumente verschoben/kopiert und dort entpackt werden. Der Benutzer kann dann aus der Anwendung weitere Dateien zu diesem Pfad hinzufügen. Kann mir bitte jemand vorschlagen, wie ich das erreichen kann?iPhone SDK - Gezippten Inhalt in Ressourcen hinzufügen und dann in den Ordner Dokumente entpacken

Danke!

+0

Ein kleiner Nachteil der folgenden Methoden besteht darin, dass Sie doppelt so viel Speicherplatz für die Speicherung dieser Ressourcen benötigen. Eine Kopie macht Ihre App größer und eine zweite Kopie befindet sich im Verzeichnis Dokumente. Vielleicht möchten Sie darüber nachdenken, ob Sie nur mit einer Kopie leben können. Ich denke, die Frage ist, ob Sie erwarten, dass diese Ressourcen schreibgeschützt oder schreibgeschützt sind. Wenn Letzteres, dann würde ich vorschlagen, dass Sie einen Weg finden, um sie zu kopieren. – mahboudz

+0

Wenn schreibgeschützt, aber Sie möchten, dass sie im Ordner Dokumente, weil der Benutzer möglicherweise einige andere Dateien hinzufügen, und Sie möchten, dass sie alle an einem Ort sein, dann würde ich vorschlagen, symbolische Verknüpfungen anstelle der Dateien zu kopieren. – mahboudz

Antwort

6

Basierend auf Ihren Kommentar oben:

Der Grund, warum ich eine komprimierte Ressource hinzufügen möchten, weil es mehrere Dateien sind. Wenn ich nicht komprimiere, dann muss ich Dateien einzeln verschieben. Ich werde auch eine Liste von Dateien irgendwo pflegen, so dass ich die Datei Namen lesen und sie dann verschieben kann. Ich dachte Zippen und Entpacken war eine einfachere Lösung.

Sie können alle Dateien zu einem Ordner in Ihrem Bundle hinzufügen. Wenn die App zum ersten Mal gestartet wird, verwenden Sie eine schnelle Aufzählung, um den Ordner zu durchsuchen, und was immer in diesem Ordner gefunden wird, wird in den Ordner "Dokumente" kopiert. Die Handhabung von Ordnern in Ordnern ist etwas komplexer (eventuell Rekursion hinzufügen). Auf diese Weise müssen Sie sich keine Gedanken über zip oder tar machen oder ein Verzeichnis von zu installierenden Dateien behalten.

Platzieren Sie einfach den Ordner mit den gewünschten Dateien in den Xcode-Ressourcenordner und weisen Sie ihn an, ihn als Ordner und nicht als Gruppe zu importieren. Auf diese Weise werden die Dateien in Ihren Ressourcen in einem Ordner anstatt nur einzelner Dateien überall installiert.

EDIT:

noch besser, das tun, was ich über alle Dateien, setzen Sie in einem Ordner mögen, zu Ihrem Projekt hinzufügen, aber nicht als „Gruppe“, und dann beim ersten Start Verwendung:

[[NSFileManager defaultManager] copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error]; 

und es wird Ihr gesamtes Verzeichnis von einem Ort zum anderen kopieren. EINFACH!

4

Fügen Sie das libz.dylib Framework zu Ihrem Projekt hinzu und fügen Sie Deusty's NSData gzip category hinzu, das Ihnen Komprimierungs-/Dekomprimierungsmethoden bietet.

+0

Es ist nicht notwendig, alle Dateien in den temporären Speicher zu entpacken, wenn es möglich ist, einzelne Dateien (in eine Datei oder vorzugsweise in NSData) bei Bedarf zu dekomprimieren (zip-Archive komprimieren die Quelldateien einzeln und behalten die ursprüngliche Ordnerhierarchie bei). Ich kenne keine gute iPhone-kompatible Lib, die das aber einfach macht. – avocade

3

Während dies mit der libz.dylib verfügbar ist, ist es wirklich unnötig, da es wenig Platz (wenn überhaupt) spart. Ihr Anwendungspaket ist bereits komprimiert, wenn es auf das Telefon übertragen wird. Komprimierung über Komprimierung ergibt normalerweise wenig zusätzliche Komprimierung.

Probieren Sie es selbst aus. Sie können feststellen, dass das Versenden Ihrer App mit entpackten Inhalten genauso viel Speicherplatz belegt wie gezippte Inhalte.

+0

Der Grund, warum ich eine komprimierte Ressource hinzufügen möchte, da mehrere Dateien vorhanden sind. Wenn ich nicht komprimiere, muss ich die Dateien einzeln verschieben. Ich muss auch irgendwo eine Liste von Dateien pflegen, damit ich den Dateinamen lesen und verschieben kann. Ich dachte, das Zippen und Entpacken wäre eine einfachere Lösung. – Mithin

+0

Sie könnten 'libtar' (http://www.feep.net/libtar/) verwenden, wenn Sie nur eine Möglichkeit zum Archivieren/Entpacken benötigen und nicht die zeitliche Komplexität einer' zip'-ped-Ressource haben möchten. –