[iOS翻譯]《iOS 7 Programming Cookbook》:iOS文件與文件夾管理(上)

簡介:git

iOS基於OS X,而OSX自己基於Unix操做系統。在iOS裏面,操做系統的徹底路徑結構是不可見的,由於每一個APP的數據都存儲自身的沙盒裏面。沙盒環境實際上聽起來像這樣:一個只容許當前APP訪問的文件夾目錄。每一個APP都有自身的沙盒文件夾,而且沙盒文件夾下的子文件夾只有當前APP可以訪問。github

當一個iOS APP在設備上安裝後,系統爲其建立的文件夾結構以下:數組

  • XXX.app
    • 即Main Bundle  
  • Documents/
    • 存儲用戶建立的內容  
  • Library/
    • 存儲緩存文件、偏好設置等等  

每一個應用的根文件夾包含各類其餘文件夾,下面是一些解釋:緩存

  • Library/Caches/
    • 存儲重複建立的緩存文件  
    • 磁盤空間不足且應用不在運行狀態時,該目錄下文件可能會被刪除,切記  
  • Library/Preferences/
    • 存儲偏好設置  
  • Library/Application Support/
    • 不會自動建立  
  • tmp/
    • 臨時文件  

如今你知道當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文件系統的指定目錄,其中兩個參數以下:

  • URLsForDirectory:
    • 想要搜索的目錄  
    • 參數值爲NSSearchPathDirectory類型的枚舉  
  • inDomains
    • 想要尋找的指定目錄  
    • 參數值爲NSSearchPathDomainMask類型的枚舉  

 

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:方法的經常使用參數:

  • URLsForDirectory
    • NSLibraryDirectory  
      • Library文件夾    
    • NSCachesDirectory  
      • Caches文件夾    
    • NSDocumentDirectory    
      • Documents文件夾    
  • inDomains
    • NSUserDomainMask  
      • 在當前用戶文件夾裏執行指定搜索    
      • 在OS X裏,這個文件夾爲 ~/    

 

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:,參數以下:

  • writeToFile
    • 要寫入的路徑,類型爲NSString  
  • atomically
    • BOOL類型。若是設爲YES,會寫入文件到一個臨時空間,而且在存儲到目的地後移除臨時文件  
  • encoding
    • 編碼模式,一般使用NSUTF8StringEncoding  
  • error
    • 存儲失敗時,使用一個指針指向NSError對象  

 

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:能夠存儲包含下列類型對象的數組:

  • NSString
  • NSDictionary
  • NSArray
  • NSData
  • NSNumber
  • NSData

 

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 }
相關文章
相關標籤/搜索