簡介:git
iOS基於OS X,而OSX自己基於Unix操做系統。在iOS裏面,操做系統的徹底路徑結構是不可見的,由於每一個APP的數據都存儲自身的沙盒裏面。沙盒環境實際上聽起來像這樣:一個只容許當前APP訪問的文件夾目錄。每一個APP都有自身的沙盒文件夾,而且沙盒文件夾下的子文件夾只有當前APP可以訪問。github
當一個iOS APP在設備上安裝後,系統爲其建立的文件夾結構以下:數組
每一個應用的根文件夾包含各類其餘文件夾,下面是一些解釋:緩存
如今你知道當APP在設備上安裝後,系統爲你建立了哪些文件夾。下一步你也許會想知道,如何找到這些文件夾的路徑。安全
/*app
本文翻譯自《iOS 7 Programming Cookbook》一書的第14章「Files and Folder Management 」,想體會原文精髓的朋友請支持原書正版。dom
——————(博客園、新浪微博)葛布林大帝函數
*/編碼
目錄:atom
一. 獲取經常使用文件夾的路徑
二. 寫入和讀取文件
三. 建立文件夾
四. 枚舉文件/文件夾
五. 刪除文件/文件夾
六. 存儲對象到文件
本書源代碼:https://github.com/oreillymedia/iOS7_Programming_Cookbook
1、獲取經常使用文件夾的路徑
問題:
你想找到可用文件夾的路徑
解決方案:
使用NSFileManager類的實例方法URLsForDirectory:inDomains:
討論:
NSFileManager類提供了許多與文件/文件夾相關的操做,我不建議使用這個類提供的defaultManager類方法來進行文件管理,由於它不是線程安全的。
NSFileManager類的URLsForDirectory:inDomains:實例方法常被用來搜索iOS文件系統的指定目錄,其中兩個參數以下:
1.Documents文件夾
假設你想要找出Documents文件夾的路徑,代碼以下:
1 NSFileManager *fileManager = [[NSFileManager alloc] init]; 2 NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory 3 inDomains:NSUserDomainMask]; 4 5 if ([urls count] > 0){ 6 NSURL *documentsFolder = urls[0]; 7 NSLog(@"%@", documentsFolder); 8 } else { 9 NSLog(@"Could not find the Documents folder."); 10 }
運行代碼,你應該獲得了Document文件夾的路徑。如今咱們來看看URLsForDirectory:inDomains:方法的經常使用參數:
2.Caches文件夾
使用這個方法,你也能夠找到Caches文件夾,以此類推:
1 NSFileManager *fileManager = [[NSFileManager alloc] init]; 2 NSArray *urls = [fileManager URLsForDirectory:NSCachesDirectory 3 inDomains:NSUserDomainMask]; 4 5 if ([urls count] > 0){ 6 NSURL *cachesFolder = urls[0]; 7 NSLog(@"%@", cachesFolder); 8 } else { 9 NSLog(@"Could not find the Caches folder."); 10 }
3.tmp文件夾
若是你想要找到tmp文件夾,使用C函數NSTemporaryDirectory():
1 NSString *tempDirectory = NSTemporaryDirectory(); 2 NSLog(@"Temp Directory = %@", tempDirectory);
2、寫入和讀取文件
問題:
你想存儲信息到磁盤(如text、data、images等等)
解決方案:
Cocoa類容許你存儲信息,例如NSString、UIImage和NSData,全部公開的實例方法容許你存儲這些數據到指定的路徑。
討論
爲了存儲text到磁盤,假設把text做爲一個NSString變量來存儲,可使用這個類的實例方法writeToFile:atomically:en coding:error:,參數以下:
1.存儲NSString
例如,若是想要臨時存儲一些text,並不須要備份,代碼以下:
1 NSString *someText = @"Random string that won't be backed up."; 2 NSString *destinationPath = 3 [NSTemporaryDirectory() 4 stringByAppendingPathComponent:@"MyFile.txt"]; 5 6 NSError *error = nil; 7 BOOL succeeded = [someText writeToFile:destinationPath 8 atomically:YES 9 encoding:NSUTF8StringEncoding 10 error:&error]; 11 12 if (succeeded) { 13 NSLog(@"Successfully stored the file at: %@", destinationPath); 14 } else { 15 NSLog(@"Failed to store the file. Error = %@", error); 16 }
2.從文件讀取NSString
完成上面的存儲後,你可使用NSString類的stringWithContentsOfFile:encoding:error:類方法獲取指定文件的路徑。
若是你想從一個文件讀取NSString內容,可使用NSString類的實例方法initWithContentsOfFile:encoding:error:,代碼以下:
1 - (BOOL) writeText:(NSString *)paramText toPath:(NSString *)paramPath{ 2 return [paramText writeToFile:paramPath 3 atomically:YES 4 encoding:NSUTF8StringEncoding 5 error:nil]; 6 } 7 - (NSString *) readTextFromPath:(NSString *)paramPath{ 8 return [[NSString alloc] initWithContentsOfFile:paramPath 9 encoding:NSUTF8StringEncoding 10 error:nil]; 11 } 12 13 - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 14 NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"MyFile.txt"]; 15 16 if ([self writeText:@"Hello, World!" toPath:filePath]){ 17 NSString *readText = [self readTextFromPath:filePath]; 18 if ([readText length] > 0){ 19 NSLog(@"Text read from disk = %@", readText); 20 }else { 21 NSLog(@"Failed to read the text from disk."); 22 } 23 24 } else { 25 NSLog(@"Failed to write the file."); 26 } 27 28 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 29 self.window.backgroundColor = [UIColor whiteColor]; [ 30 self.window makeKeyAndVisible]; return YES; 31 }
上面建立了兩個便利方法,容許咱們從指定位置寫入和讀取文本。
若是你想使用NSURL的實例,可使用writeToURL:atomically:encoding:error:實例方法來代替。
3.寫入和讀取NSArray
Foundation其餘類的寫入方法相似NSString,對於NSArray,可使用實例方法writeToFile:atom ically:。
爲了從磁盤讀取array的內容,可使用初始化方法initWithContentsOfFile:,代碼以下:
1 NSString *filePath = [NSTemporaryDirectory() 2 stringByAppendingPathComponent:@"MyFile.txt"]; 3 4 NSArray *arrayOfNames = @[@"Steve", @"John", @"Edward"]; 5 if ([arrayOfNames writeToFile:filePath atomically:YES]){ 6 NSArray *readArray = [[NSArray alloc] initWithContentsOfFile:filePath]; 7 if ([readArray count] == [arrayOfNames count]){ 8 NSLog(@"Read the array back from disk just fine."); 9 } else { 10 NSLog(@"Failed to read the array back from disk."); 11 } 12 } else { 13 NSLog(@"Failed to save the array to disk."); 14 }
NSArray的實例方法writeToFile:atomically:能夠存儲包含下列類型對象的數組:
4.寫入和讀取NSDictionary
字典的讀寫操做與數組十份類似,代碼以下:
1 NSString *filePath = [NSTemporaryDirectory() 2 stringByAppendingPathComponent:@"MyFile.txt"]; 3 NSDictionary *dict = @{ 4 @"first name" : @"Steven", 5 @"middle name" : @"Paul", 6 @"last name" : @"Jobs", 7 }; 8 9 if ([dict writeToFile:filePath atomically:YES]){ 10 NSDictionary *readDictionary = [[NSDictionary alloc] 11 initWithContentsOfFile:filePath]; 12 13 /* Now compare the dictionaries and see if the one we read from disk is the same as the one we saved to disk */ 14 if ([readDictionary isEqualToDictionary:dict]){ 15 NSLog(@"The file we read is the same one as the one we saved."); 16 } else { 17 NSLog(@"Failed to read the dictionary from disk."); 18 } 19 } else { 20 NSLog(@"Failed to write the dictionary to disk."); 21 }
5.char與NSData
想要寫入一個char類型,可使用NSData,代碼以下:
1 NSString *filePath = [NSTemporaryDirectory() 2 stringByAppendingPathComponent:@"MyFile.txt"]; 3 4 char bytes[4] = {'a', 'b', 'c', 'd'}; 5 6 NSData *dataFromBytes = [[NSData alloc] initWithBytes:bytes 7 length:sizeof(bytes)]; 8 9 if ([dataFromBytes writeToFile:filePath atomically:YES]){ 10 NSData *readData = [[NSData alloc] initWithContentsOfFile:filePath]; 11 if ([readData isEqualToData:dataFromBytes]){ 12 NSLog(@"The data read is the same data as was written to disk."); 13 } else { 14 NSLog(@"Failed to read the data from disk."); 15 } 16 } else { 17 NSLog(@"Failed to save the data to disk."); 18 }