iOS開發日記14-NSFileManager(沙箱和清除緩衝),ios沙箱緩衝
今天博主有一個檔案管理的需求,遇到了一些困痛點,在此和大家分享,希望能夠共同進步.
iOS的沙箱機制,應用只能訪問自己應用目錄下的檔案。iOS不像Android,沒有SD卡概念,不能直接存取映像、視頻等內容。iOS應用產生的內容,像、檔案、緩衝內容等都必須儲存在自己的沙箱內。預設情況下,每個沙箱含有3個檔案夾:Documents, Library 和 tmp。Library包含Caches、Preferences目錄.
Documents:蘋果建議將程式建立產生的檔案以及應用瀏覽產生的檔案資料儲存在該目錄下,iTunes備份和恢複的時候會包括此目錄
Library:儲存程式的預設設定或其它狀態資訊;
Library/Caches:存放快取檔案,儲存應用的持久化資料,用於應用升級或者應用關閉後的資料儲存,不會被itunes同步,所以為了減少同步的時間,可以考慮將一些比較大的檔案而又不需要備份的檔案放到這個目錄下。
tmp:提供一個即時建立臨時檔案的地方,但不需要持久化,在應用關閉後,該目錄下的資料將刪除,也可能系統在程式不啟動並執行時候清除
代碼的注釋還算詳細,我把代碼貼出來,希望大家自己揣摩
1.檔案操作
#pragma mark---------NSFileMnager管理檔案類
//拼接存放資料的檔案路徑
NSString *documentPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
//1.建立檔案夾
//拼接路徑(在哪個檔案夾下面建立新的檔案夾,檔案夾的名字)
NSString *activitypath=[documentPath stringByAppendingPathComponent:@"activitypath"];
//建立檔案夾
[[NSFileManager defaultManager] createDirectoryAtPath:activitypath withIntermediateDirectories:YES attributes:nil error:nil];
#pragma mark----將複雜物件隱藏檔----(複雜物件->歸檔->NSData->拼接檔案路徑->writeToFile)
NSLog(@"%ld",_activity.wisher_count);
//建立一個可變的NSMutableData對象,用來存放person對象被歸檔之後的data資料
NSMutableData *activityData=[NSMutableData data];
//建立一個歸檔工具對象
NSKeyedArchiver *archiver=[[[NSKeyedArchiver alloc]initForWritingWithMutableData:activityData]autorelease];
//開始對activity進行歸檔(activity -> NSData)
[archiver encodeObject:_activity forKey:@"activity"];
#warning ----------
//當歸檔結束時,一定要調用finishEncoding
[archiver finishEncoding];
//完成轉換了,此時activityData存放的就是activity對象被歸檔之後的NSData類型資料
//拼接路徑
NSString *ActivityPath=[activitypath stringByAppendingPathComponent:_activity.title];
//判斷檔案是否存在
//①.判斷需要的檔案存不存在
BOOL flag=[[NSFileManager defaultManager]fileExistsAtPath:ActivityPath];
NSLog(@"flag=%d",flag);
//如果檔案存在,
if (flag) {
NSLog(@"ActivityPath=%@",ActivityPath);
}else{
//將歸檔之後的activityData資料寫入activity.txt中
[activityData writeToFile:ActivityPath atomically:YES];
NSLog(@"ActivityPath=%@",ActivityPath);
}
2.清除緩衝
//利用GCD
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//找到緩衝所存的路徑
NSString * path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)lastObject];
//要清除的文
NSArray * files = [[NSFileManager defaultManager]subpathsAtPath:path];//返回這個路徑下的所有檔案的數組
for (NSString * p in files) {
NSError * error = nil;
NSString * cachPath = [path stringByAppendingPathComponent:p];
if ([[NSFileManager defaultManager]fileExistsAtPath:cachPath]) {
[[NSFileManager defaultManager]removeItemAtPath:cachPath error:&error];//刪除
}
}
});