沙盒結(jié)構(gòu)分析&偏好設(shè)置

在iOS中作谭,每個應(yīng)用程序都有自己的沙盒(sandBox)稽物,所有的非代碼文件都要保存在此,例如圖像折欠,圖標(biāo)贝或,聲音,映像锐秦,屬性列表咪奖,文本文件等。

1. 目錄結(jié)構(gòu)

An iOS app operating within its own sandbox directory酱床。

ios_app_layout_2x.png

我們可以訪問沙盒下的文件夾:

sandbox.png
  1. 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ū)別字符

  1. 真機(jī)中類似:
/var/mobile/Containers/Data/Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/

類似Application/9AC577C1-08B2-4BAE-9CE2-1211E4994F9E/這個目錄就是每個應(yīng)用沙盒的根目錄羊赵。

沙盒中的目錄結(jié)構(gòu)包括:

  1. Documents:保存應(yīng)用運(yùn)行時生成的需要持久化的數(shù)據(jù),iTunes備份和恢復(fù)的時候會包括此目錄扇谣。
  2. 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)容芹血。比如說:是否允許訪問圖片,是否允許訪問地理位置。
  3. SystemData:存放系統(tǒng)數(shù)據(jù)楞慈。
  4. 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).獲取目錄列里所有文件名subpathsOfDirectoryAtPathsubpathsAtPath 兩個方法都可以兔乞。

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的形式存入。

NSUserDefaults.png

注意:UserDefaults設(shè)置數(shù)據(jù)時淡溯,不是立即寫入读整,而是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了咱娶。出現(xiàn)以上問題米间,可以通過調(diào)用synchornize方法強(qiáng)制寫入[defaults synchornize];



Demo下載


參考文獻(xiàn):

File System Programming Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豺总,隨后出現(xiàn)的幾起案子车伞,更是在濱河造成了極大的恐慌择懂,老刑警劉巖喻喳,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異困曙,居然都是意外死亡表伦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門慷丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹦哼,“玉大人,你說我怎么就攤上這事要糊「傺” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵锄俄,是天一觀的道長局劲。 經(jīng)常有香客問我,道長奶赠,這世上最難降的妖魔是什么鱼填? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮毅戈,結(jié)果婚禮上苹丸,老公的妹妹穿的比我還像新娘愤惰。我一直安慰自己,他們只是感情好赘理,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布宦言。 她就那樣靜靜地躺著,像睡著了一般商模。 火紅的嫁衣襯著肌膚如雪蜡励。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天阻桅,我揣著相機(jī)與錄音凉倚,去河邊找鬼。 笑死嫂沉,一個胖子當(dāng)著我的面吹牛稽寒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趟章,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杏糙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚓土?” 一聲冷哼從身側(cè)響起宏侍,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀漆,沒想到半個月后谅河,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡确丢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年绷耍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲜侥。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡褂始,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出描函,到底是詐尸還是另有隱情崎苗,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布舀寓,位于F島的核電站胆数,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏基公。R本人自食惡果不足惜幅慌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轰豆。 院中可真熱鬧胰伍,春花似錦齿诞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渗饮,卻和暖如春但汞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背互站。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工私蕾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胡桃。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓踩叭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親翠胰。 傳聞我的和親對象是個殘疾皇子容贝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容