2011-02-02 12 views
1

NSDataを使用してiOS 4.2のファイルを保護しています。 ファイルだけでWebサービスを使用して一時フォルダにダウンロードされており、現在、私はそのNSDataのを使用して、最終的な目的地と次のコードにそれをコピーして、保護したい:私は思ったんだけど何ファイルを保護するときに、ファイル内容全体をメモリに保存または保存するときにNSDataストリーミングが行われますか?

NSData oData = NSData.FromFile (sSourcePathAndFile); 
NSError oError = null; 
oData.Save (sDestPathAndFile, NSDataWritingOptions.FileProtectionComplete, out oError); 

:ファイルならばNSDataはそれをチャンクに保存しますか?それとも、ファイル全体をメモリにロードし、最終的にはメモリ不足になり、失敗しますか?

サイドノート:iOSデバイスをバックアップして別のデバイスに復元すると、保護されたファイルはそこに読み込めますか?はいの場合、全体の保護は私には分かりません。

答えて

1

(私は専門家だが)MonoTouchでのドキュメントをチェックするから、NSData.FromFileは、Objective-Cのに正確にマッピングするために表示されます。

NSData +dataWithContentsOfFile: 

ファイル全体を一度にメモリにロードさせます。これはthis pageである - 「パスで指定されたファイルからすべてのバイトを読み取ることによるデータオブジェクト」。これは、AppleのNSDataリファレンスのthe relevant bitという言葉にかなり似ています。

ありMonoTouchで同等であることが表示されませんが、Objective-Cで行うには正しい事は使用することです:文書hereとして

NSData +dataWithContentsOfMappedFile: 

iOSは、他のすべてのOSと同様に、完全に仮想化されたメモリサブシステムを備えており、ページファイルが不足しています。 dataWithContentsOfMappedFile:を使用すると、そのファイルをメインメモリにマップし、他の仮想メモリプールと同様に、通常のページングメカニズムが物理RAMに余裕を持って物理RAMに保存するようにします。

けれどもdataWithContentsOfMappedFile:dataWithContentsOfFileに頼ることがあります。いくつかの環境では(それがiOSの上でいけないが)、システムがdataWithContentsOfMappedFileを代用することはできません:dataWithContentsOfFileのために:すべてのケースでは、前者はファイルがオンに変更されないことを必要とするため、 NSDataオブジェクトの存続期間の間、ディスクを即座に読み込み、必要に応じてオリジナルを削除または変更できるようにします。

モノタッチの専門家の方が多い場合は、NSData.FromMappedFileを追加する方法や、他の方法でこの機能がどのように公開されているかについてアドバイスできますことを願っています。

+0

さらに、1GBファイルをダウンロードして暗号化し、何が起こるかを確認します。 – Krumelur

+0

+ dataWithContentsOfMappedFile:ではなくNSDataReadingMappedオプションを使用することをお勧めします。それはオプションフラグをサポートするように思われるので、モノトゥッチでも利用可能かもしれません... –

+0

MTで利用可能です。私はちょうど別の方法を見つけました:NSFileManagerは既存のファイルのセキュリティクラスを変更することができます。だからNSDataを追加レイヤーとして追加するのではなく、ファイルをWebからデバイスにストリームし、その後NSFileManagerを使用して暗号化すると、不利な点があるのだろうかと思います。 – Krumelur

0

バッファの量を制御してデバイスのメモリが不足しないようにするには、FileStream(System.IO)を開いて手動でバイトを書き込むことができます。それはMonoTouchの素晴らしい点です。 .NETフレームワークを使用できます。

+0

NSDataにもFromStream()メソッドがありますが、それでもストリーム全体を再読み込みして保存することができます。 – Krumelur

関連する問題