iOS之檔案管理
沙盒
iOS的沙盒機制:
1、iOS的應用程式只能對自己建立的檔案系統讀取檔案,這個獨立、封閉、安全的空間,叫做沙盒。它一般存放著程式包檔案(可執行檔案)、圖片、音訊、視訊、plist檔案、sqlite資料庫以及其他檔案;
2、每個應用程式都有自己的獨立的儲存空間(沙盒);
3、一般來說,應用程式之間是不可以互相訪問沙盒的;
4、模擬器的沙盒位置路徑:/User/userName/Library/Application Support/iPhone Simulator沙盒的構成:當建立應用程式的時候,在每個沙盒中都含有三個檔案,分別是Document、Library和temp。
1、Document:一般需要持久的資料都放在此目錄中,可以在當中新增子資料夾,iTunes備份和恢復的時候,會包括此目錄;
2、Library:設定程式的預設設定和其他的狀態;
3、temp:建立臨時檔案的目錄,當iOS裝置重啟時,檔案會被自動清除。獲取沙盒的目錄:
.h檔案
#import <Foundation/Foundation.h>
@interface YDWSandBoxPath : NSObject
// 獲取沙盒Document檔案目錄
+ (NSString *)getDocumentDirectory;
// 獲取沙河Library檔案目錄
+ (NSString *)getLibraryDirectory;
// 獲取沙盒Library/Caches檔案目錄
+ (NSString *)getCacheDirectory;
// 獲取沙盒Preference檔案目錄
+ (NSString *)getPreferencePanesDirectory;
//獲取沙盒tmp檔案目錄
+ (NSString *)getTmpDirectory;
@end
.m檔案
#import "YDWSandBoxPath.h"
@implementation YDWSandBoxPath
+ (NSString *)getDocumentDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString *)getLibraryDirectory {
return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES ) lastObject];
}
+ (NSString *)getCacheDirectory {
return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString *)getPreferencePanesDirectory {
return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject];
}
+ (NSString *)getTmpDirectory {
return NSTemporaryDirectory();
}
@end
- 清除快取:在開發的過程中,遇到有用的資料,會進行快取,當該資料不需要時,可以清除。在這裡整理了幾個方法,統計檔案的大小,清除指定檔案,清除指定目錄下的全部檔案等。
// 根據路徑返回目錄或檔案的大小
+ (double)sizeWithFilePath:(NSString *)path {
// 獲取檔案的管理者
NSFileManager *manager = [NSFileManager defaultManager];
// 檢測路徑的合理性
BOOL direct = NO;
BOOL exits = [manager fileExistsAtPath:path isDirectory:&direct];
if (!exits) {
return 0;
}
if (direct) {
NSArray *subPaths = [manager subpathsAtPath:path];
int totalSize = 0;
for (NSString *subPath in subPaths) {
NSString *fullSubPath = [path stringByAppendingPathComponent:subPath];
BOOL dir = NO;
[manager fileExistsAtPath:path isDirectory:&dir];
if (!dir) {
NSDictionary *attrs = [manager attributesOfItemAtPath:fullSubPath error:nil];
totalSize += [attrs[NSFileSize] integerValue];
}
}
return totalSize/(1024*1024.0);
} else {
NSDictionary *attrs = [manager attributesOfItemAtPath:path error:nil];
return [attrs[NSFileSize] intValue]/(1024*1024.0);
}
}
// 得到指定目錄下的所有檔案
+ (NSArray *)getAllFileNames:(NSString *)dirPath {
return [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:dirPath error:nil];
}
// 刪除指定目錄或檔案
+ (BOOL)clearCacheWithFilePath:(NSString *)path {
return [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
// 清空指定目錄下檔案
+ (BOOL)clearCacheFormDirectoryPath:(NSString *)dirPath {
NSArray *fileArray = [YDWSandBoxPath getAllFileNames:dirPath];
BOOL flag = NO;
for (NSString *fileName in fileArray) {
NSString *filePath = [dirPath stringByAppendingPathComponent:fileName];
flag = [YDWSandBoxPath clearCacheWithFilePath:filePath];
if (!flag) {
break;
}
}
return flag;
}
NSData
- NSData儲存的是二進位制資料,遮蔽了資料之間的差異,文字、音訊、影象等資料都可用NSData來儲存;
NSData的用法:
1、NSString與NSData互相轉換
NSData –> NSString為:NSString *dataString = [[NSString alloc] initWithData:[NSData data] encoding:NSUTF8StringEncoding];NSString –> NSData為:NSData *stringData = [[NSString string] dataUsingEncoding:NSUTF8StringEncoding];
將data型別的資料,轉成UTF8的資料:
+ (NSString*)dataToUTF8String:(NSData *)data {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
將string轉換為指定編碼 :
+ (NSString *)changeDataToEncodinString:(NSData *)data encodin:(NSStringEncoding )encoding {
return [[NSString alloc] initWithData:data encoding:encoding];
}
2、NSData 與 UIImage
NSDat –> UIImage為:UIImage *image = [UIImage imageWithData: imageData];
例如:
- (NSData *)changePictureToNSData {
NSString *filePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"ceshi.png"]];
NSData *imageData = [NSData dataWithContentsOfFile:filePath];
return imageData;
}
Plist檔案 ##:
陣列、字典只能將BOOL、NSNumber、NSString、NSData、NSDate、NSArray、NSDictionary寫入屬性列表plist檔案.
- String方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
[[NSString string] writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
- Array方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
[[NSArray array] writeToFile:path atomically:YES];
- Dictionary方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
[[NSDictionary dictionary] writeToFile:path atomically:YES];