3

NSFileWrapperユーザーのデータのバックアップを作成するために使用しているアプリがあります。このバックアップ ファイルには、テキスト ファイルとメディア ファイルが含まれます (ここでは圧縮は関係ありません)。場合によっては、これらのバックアップ ファイルが非常に大きくなり、サイズが 200 MB を超えることがあります。呼び出すNSFileWrapper -writeToURL...と、書き込みプロセスの一部としてコンテンツ全体がメモリに読み込まれるように見えます。古いデバイスでは、メモリの制約により、アプリがシステムによって終了されます。

NSFileWrapperすべてをメモリにロードすることを避ける簡単な方法はありますか? NSFileWrapperここで見つけたすべての質問を読みました。これに取り組む方法について何か提案はありますか?

バックアップ ファイルの現在のファイル構造は次のとおりです。

BackupContents.backupxyz user.txt - folder1 - audio files asdf.caf asdf2.caf - folder2 - audio files asdf3.caf

繰り返しますが、音声ファイルを圧縮するように言わないでください。それは、欠陥のある設計に対する応急処置にすぎません。

を使用してすべてのファイルをディレクトリに移動/コピーし、NSFileManagerそのディレクトリをパッケージにすることができるようです。その道を行くべきでしょうか?

4

1 に答える 1

3

ツリーがディスクに書き出されるNSFileWrapperと、元のファイルを新しい場所にハードリンクしようとしますが、originalContentsURL.

プログラムでファイル ラッパーを作成しているように聞こえるため (バックアップ シナリオ用)、ファイルはファイル システム全体に分散している可能性があります。これは、 を持ってwriteToURLないときに . を意味します。これは、ハードリンク ロジックがスキップされ、ファイルが読み込まれて書き換えられることを意味します。originalContentsURL

したがって、ハードリンクの動作が必要な場合は、originalContentsURL. writeToURLこれは、最初の呼び出しに適切な URL を指定することによって最も簡単に実行できます。

または、通常のファイルのサブクラス化を試して、内部的に保持NSFileWrapperする を与えることもできます。この新しい URL を に渡すNSURLにはオーバーライドする必要がありますが、その URL はハードリンク コードをトリガーするのに十分なはずです。次に、ハードリンクを配置する大きなファイルにこのサブクラスを使用する必要があります。writeToURLsuperNSFileWrapper

于 2015-06-19T17:40:50.083 に答える