在iOS中作谭,每個應(yīng)用程序都有自己的沙盒(sandBox)稽物,所有的非代碼文件都要保存在此,例如圖像折欠,圖標(biāo)贝或,聲音,映像锐秦,屬性列表咪奖,文本文件等。
1. 目錄結(jié)構(gòu)
An iOS app operating within its own sandbox directory酱床。
我們可以訪問沙盒下的文件夾:
- Xcode的模擬器的目錄類似:
/Users/XXX/Library/Developer/CoreSimulator/Devices/F03C84B3-2A5E-44A7-AA51-2142A6397CA7/data/Containers/Data/Application/E83106A7-FCF3-45A6-888E-330BC52B279B/
Devices/F03C84B3-2A5E-44A7-AA51-2142A6397CA7
是Xcode中不同模擬器的區(qū)別字符
- 真機(jī)中類似:
/var/mobile/Containers/Data/Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/
類似Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/
這個目錄就是每個應(yīng)用沙盒的根目錄羊赵。
沙盒中的目錄結(jié)構(gòu)包括:
- Documents:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes備份和恢復(fù)的時候會包括此目錄扇谣。
- Library:存儲的程序默認(rèn)的設(shè)置和其他信息昧捷。
- Library/Caches:存放緩存文件,iTunes不會備份此目錄罐寨,此目錄下文件不會在應(yīng)用退出刪除
- Library/Preferences:保存應(yīng)用程序的所有偏好設(shè)置iOS的Settings(設(shè)置)靡挥,我們不應(yīng)該直接在這里創(chuàng)建文件,而是需要通過NSUserDefault這個類來訪問應(yīng)用程序的偏好設(shè)置衩茸。iTunes會自動備份該文件目錄下的內(nèi)容芹血。比如說:是否允許訪問圖片,是否允許訪問地理位置。
- SystemData:存放系統(tǒng)數(shù)據(jù)楞慈。
- tmp:臨時文件目錄幔烛,在程序重新運(yùn)行的時候,和開機(jī)的時候囊蓝,會清空tmp文件夾饿悬。
2. 獲取方式
1).獲取沙盒的Home目錄
//獲取根目錄
NSString *homePath = NSHomeDirectory();
NSLog(@"Home目錄:%@",homePath);
2).獲取沙盒的Documents目錄
/* 獲取Documents文件夾目錄,
@param NSDocumentDirectory 獲取Document目錄
@param NSUserDomainMask 是在當(dāng)前沙盒范圍內(nèi)查找
@param YES 展開路徑,NO是不展開; YES 代表展開路徑中的波浪字符“~”
@return test.txt文件的路徑
*/
NSString *filePath =[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
3).獲取Library文件路徑
/**
* 獲取Library目錄下文件路徑
*
* @param NSLibraryDirectory 獲取Library目錄
* @param NSUserDomainMask 在當(dāng)前的沙盒范圍內(nèi)查找
* @param YES 展開路徑聚霜,NO不展開路徑 *
* @return test.txt文件的路徑
*/ NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
4).獲取Library/Caches文件目錄
/**
* 獲取Library目錄下文件路徑
*
* @param NSCachesDirectory 獲取Library/Caches目錄
* @param NSUserDomainMask 在當(dāng)前的沙盒范圍內(nèi)查找
* @param YES 展開路徑狡恬,NO不展開路徑 *
* @return test.txt文件的路徑
*/NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"test.txt"];
5).獲取Library/Preferences文件目錄珠叔。Preferences由系統(tǒng)維護(hù),不需要我們手動的獲取文件路徑進(jìn)行操作弟劲,而是需要借助NSUserDefault來操作,但是我們是可以獲取到這個文件的祷安。
/**
* 獲取Library目錄下文件路徑
*
* @param NSLibraryDirectory 獲取Library目錄
* @param NSUserDomainMask 在當(dāng)前的沙盒范圍內(nèi)查找
* @param YES 展開路徑,NO不展開路徑 *
* @return test.txt文件的路徑
*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"Preferences"];
6).獲取tmp文件路徑
/**
* 獲取tmp文件目錄下的文件路徑
*
* @return test.txt的文件路徑
*/
NSString *filePath = [NSTemporaryDirectory()stringByAppendingPathComponent:@"test.txt"]
3. 常用操作
1).在Documents里創(chuàng)建目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
// 創(chuàng)建目錄
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
2).向沙盒中寫入文件
//向沙盒中寫入文件
NSString *documentsPathW = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
//寫入文件
if (!documentsPathW) {
NSLog(@"目錄未找到");
}else {
NSString *filePaht = [documentsPath stringByAppendingPathComponent:@"test.txt"];
NSArray *array = [NSArray arrayWithObjects:@"code",@"change", @"world", @"OK", nil];
[array writeToFile:filePaht atomically:YES];}
3).向沙盒中讀取文件
//從沙盒中讀取文件
NSString *documentsPathR = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
NSString *readPath = [documentsPathR stringByAppendingPathComponent:@"test.txt"];
NSArray *fileContent = [[NSArray alloc] initWithContentsOfFile:readPath];
NSLog(@"文件內(nèi)容:%@",fileContent);
4).判斷一個文件是否存在,傳入全路徑(fileExistsAtPath)
// 創(chuàng)建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString * filePath = [documents stringByAppendingPathComponent:@"test"];
// 判斷一個文件是否存在,傳入全路徑
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"it is exit");
}
5).獲取目錄列里所有文件名subpathsOfDirectoryAtPath
和 subpathsAtPath
兩個方法都可以兔乞。
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory: %@",documentsDirectory);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%@",file);
NSArray *file2 = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%@",file2);
4. Preference(偏好設(shè)置)
對于數(shù)據(jù)量不大的存儲策略我們通常會采用NSUserDefaults汇鞭。實際上,NSUserDefaults就是寫入到Preference中庸追,他會自動在Library/Preferences中生成plist文件霍骄,并以key-value的形式存入。
注意:UserDefaults設(shè)置數(shù)據(jù)時淡溯,不是立即寫入读整,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了咱娶。出現(xiàn)以上問題米间,可以通過調(diào)用synchornize方法強(qiáng)制寫入[defaults synchornize];
參考文獻(xiàn):