ディスクの空き容量がいつ変化したかをアプリに認識させ、ビューを更新したいと考えています。システムから送信される通知はありますか?
3 に答える
少し話題から外れています...しかし、これを書くことを余儀なくされていると感じています。
ディスク容量の変更に関する通知が悪いのはなぜですか?
考えてみてください。「使用可能」または「使用済み」のスペースを知ることは、かなり強力なアドホック/ POSスナップショットであるため、通知を受けるよりも照会するのにはるかに適した問題が複数あります。
ファイルシステム(および/またはデータベース)は、「ディスク」(この投稿では「ディスク」と呼びます)の上にある抽象化レイヤーです。これは、特に、次のような仮定を意味します。
- 使用済みディスク容量は、すべてのファイルのサイズの合計に等しい(またはそれに近い)
- 空きディスク容量は、新しく作成されたファイルに完全に割り当てることができます。または、既存のファイルをその量だけ増やすことができます。
- ファイルのサイズ変更(拡張または切り捨て)は、空き/使用済みディスクスペースの同等の変更に反映されます
- 空きディスク容量は正確/正確にわかる量です
- 総ディスク容量は一定です
正しくありません。
これは、ファイルシステムが次のような手法を自由に実装できるためです。
- 圧縮-使用済みスペースをファイルサイズの合計よりも少なくし、書き込まれる将来のデータの圧縮率を予測できないため、正確な空きスペースを認識できなくなります
- 重複排除-同様の効果(使用済み/空きディスク容量)
- スナップショット-ファイルシステムが「削除された」データを保持するようにするため、以前にファイルで使用されていたスペースを解放したと思われる場合でも、ディスクスペースが「解放」されません。
- スパースファイル-古い手法では、「ゼロ圧縮」と呼ぶことができます。つまり、書き込まれるものがすべてゼロの場合は、ディスク領域を割り当てないでください。
- スペースの予約-ファイルシステムは、特権アプリ/ユーザーのみが使用するため、および/または特定のインターフェースを介してのみ使用するために、一定量のスペースを確保する場合があります
- オンラインファイルシステムのサイズ変更-ファイルシステムで使用可能なディスクの総量が増減する可能性があります
- ライブデフラグ-使用済みスペースを合体させる可能性があります
- ブロックの再配布-フラッシュデバイスの場合、消去ブロックレベルで合体し、フラッシュFTLがスペースを解放できるようにする可能性があります
- ジャーナルローリング-ログ内のトランザクションのタイプに応じて、使用量を解放または増加させる可能性があります
- ...そしてそうではありません。
また、ファイルサイズはバイト精度ですが、ディスク割り当てはより大きなサイズ(ブロック/セクター/ストライプ/ ...)で管理されます。
したがって、ファイルシステムは、たとえばオンラインの重複排除/圧縮/最適化/ ...ジョブをバックグラウンドアクティビティとして実行しながら、完全に静的な(表示されるファイルとディレクトリとそれらに含まれるものの観点から)ビューをアプリケーションの世界に提示できます。ストレージやCPUパワーが許す限り、「ディスクスペース使用量」の統計を変更し続けます。
最新のファイルシステム(たとえば、フラッシュベースのストレージで実行されるものの多く)は、上記の手法の重要なサブセットを実装することが多いため、「割り当て可能なディスク容量」の変更ごとに通知するインターフェイスを実装するのではなく、おそらく無意味なデータを報告するだけでなく、その「通常の」操作が原因でパフォーマンスが大幅に低下し、そのような通知が大量に発生する可能性があります。
エルゴ:
通知を受け取ることを期待しないでください。この情報をポーリングします-妥当な間隔で明示的にクエリします。特にモバイルデバイスではCPUに縛られないようにし、「驚くべき」結果を期待しないでください。つまり、明らかなユーザーアクションがない場合の変更、およびユーザーアクションが発生した場所での変更はありません。取得したデータを一粒の塩で取得し、そこからあまり多くの結論を導き出さないでください。それはあなたのための最新のファイルシステムです...
いいえ、システムからの通知はありません。
しかし、幸いなことに、残りの空き領域のサイズを自分で監視し、変化に気付いたときに何かを行うことができます。
iPhone /iPadデバイスで使用可能な/空きディスク容量の合計を検出する方法を確認してください。方法を確認します。
こちらのリンクを参照してください。iPhone/iPad デバイスで利用可能な/空きディスク容量の合計を検出するにはどうすればよいですか?
これを試すことができます。
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
そしてこれも
-(uint64_t)getFreeDiskspace {
uint64_t totalSpace = 0.0f;
uint64_t totalFreeSpace = 0.0f;
NSError *error = nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error];
if (dictionary) {
NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize];
NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize];
totalSpace = [fileSystemSizeInBytes floatValue];
totalFreeSpace = [freeFileSystemSizeInBytes floatValue];
NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll));
} else {
NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], [error code]);
}
return totalFreeSpace;
}