Avatar
NSFileHandleのエラーについてお伺いしたいです(SwiftのFileHandleも同じとは思いますが、Objective-Cで書かれた古いコードに起因する部分なので、正確性を期すためにObjective-CのAPIで質問します)。 iPad向けアプリで、ある程度大きなデータ量になることがあるローカルにあるバイナリファイルを部分的に読み書きするために、 -seekToOffset:error:-seekToEndReturningOffset:error: でシークしたあと、 -readDataUpToLength:error: (以下「read API」)や -writeData:error: (以下「write API」)を使っています。頻度は低いものの、read APIやwrite APIがエラーになることを確認しています。 read APIは 「Error Domain=NSCocoaErrorDomain Code=257 "ファイルを表示するためのアクセス権がないため、開けませんでした。" UserInfo={NSUnderlyingError=0x280241b30 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}」というエラーが出たのを確認していますが、ファイルは存在し、同じインスタンスでその手前までread APIの呼び出しが何度も成功した後に起こっているので、アクセス権がないということはないと思います。 write APIは、処理ロジックと作られたデータからの分析ですが、同一インスタンスで28590回成功後、387回失敗、1回成功、1失敗、63406回成功となった形跡があります。 何かエラーになる条件が分かれば、そのタイミングでは処理を避けるといったことを検討したいのですが、エラーになる条件として考えられるものがあれば教えていただきたいです。また、エラー発生時のリカバリについて例えばリトライしてみるというのは回復の可能性があるでしょうか。特にwrite APIの方は一部だけ失敗するとデータ破損を招くので頭を抱えています。 あと、エラーを返さない旧API( -readDataOfLength:-writeData: )と挙動の違いはあるのでしょうか。どうも新APIに置き換えた頃からデータ破損報告が見られるようになった感もあり…(たまたまかもしれません)。 (edited)