天天看點

OC學習日記016-IOS檔案系統IOS檔案系統下載下傳檔案

IOS檔案系統

前言

我們其實已經把OC的大緻内容學完了,我們在上幾章已經開始用iOS的結構去寫程式了,我們今天來講講IOS的檔案結構,以便于我們之後講UI的時候可以更好的接軌。

IOS的檔案系統組成

當第一次啟動app 的時候,IOS作業系統就為此APP建立一個檔案系統,該檔案系統下預設有四個目錄,分别是:

Documents:存儲使用者在操作app時産生的資料,此目錄下的資料可以通過iCloud進行同步
 Library:使用者偏好設定,通常和此類NSUserDefaults搭配使用,在此目錄下的資料可以通過iCloud進行同步
 tmp:存放臨時資料,在此目錄下的資料不會通過iCloud同步
 app包:開發者不會操作此目錄,通常是通過NSBundle來擷取包内資源,如工程的素材
           

通路方法

在新的IOS檔案系統結構中,app包的存儲路徑跟Documents、Library、tmp不是在同一個檔案夾下,是以app包的通路方法與其他三個有所不同:

app包

NSLog(@"%@",[NSBundle mainBundle]);
           

擷取程式的根目錄

而其他三個檔案夾都是在同一個目錄下,是以它們的通路方法都是大同小異(tmp有它獨有的方法),我們要先找到它們的根目錄。

想要擷取根目錄下Documents

NSString *documentsPath= [rootPath stringByAppendingPathComponent:@"Documents"];
           

或者

NSString *documentsPath =[rootPath stringByAppendingFormat:@"/Documents"];
           
最常用的擷取Documents目錄的方式(也是Library最常用的方式)
NSArray *array= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentsPath = [array objectAtIndex:];
           

講上述兩行代碼合并後,可以簡寫為:

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];
           

擷取Library目錄

字元串拼接方式進行擷取

NSString *LibraryPath=[rootPath stringByAppendingPathComponent:@"Library"]; 
           

擷取Library最常用的方式

擷取tmp目錄

tmp獨有的通路路徑的方法

下載下傳檔案

下載下傳一個視訊檔案到Documents目錄下的Video檔案

我們首先要實作一個在Documents檔案夾下建立檔案夾的方法:

-(NSString *)createDirInDocuments:(NSString *)dirName{
    //擷取Documents的檔案路徑
    NSString *doucumentsPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:];   
    //拼接成我們想要的檔案的路徑的字元串
    NSString *dirDocuments=[doucumentsPath stringByAppendingPathComponent:dirName];
    //NSFileManager 單例類,用于檔案的建立
    NSFileManager *fileManager =[NSFileManager defaultManager];
    //判斷本地是否存在某個檔案或者檔案夾
    BOOL isExist = [fileManager fileExistsAtPath:dirDocuments];
    if (!isExist) {
        //建立檔案夾
        NSError *error;
        BOOL isSuccess = [fileManager createDirectoryAtPath:dirDocuments withIntermediateDirectories:YES attributes:nil error:&error];
        if(!isSuccess){
            //如果檔案夾建立檔案夾,将錯誤資訊列印
            NSLog(@"error= %@",error.debugDescription);
            dirDocuments=nil;
        }
    }
    return dirDocuments;
}
           

然後我們借助這個方法去建立Video檔案夾,然後判斷此路徑是否已經有這個檔案,再借助data類型進行下載下傳:

NSString *videoPath=[self createDirInDocuments:@"Video"];
if(videoPath != nil){
       NSString *[email protected]"http://163.177.2.46/youku/6573B6F0A684382F3E4D0341F2/0300080100536FBEDAABC00172D4733C053123-91E7-7011-9F9B-ECC617DC9593.mp4";  
        NSString *filePath=[videoPath stringByAppendingPathComponent:[videoURLString lastPathComponent]];
        //如果檔案夾中不存在該路徑
        NSFileManager *fileManager=[NSFileManager defaultManager];
        if(![fileManager fileExistsAtPath:filePath]){
            NSData *data = nil;
          //  NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:videoURLString ]];
            //用NSFileManger的對象,将檔案寫入本地
            BOOL isSuccess=[fileManager createFileAtPath:filePath contents:data attributes:nil];
            if (isSuccess) {
                NSLog(@"視訊下載下傳成功");
            }
            else{
                NSLog(@"視訊下載下傳失敗");
            }
        }
    }
           

下載下傳三張指定的圖檔到tmp中的Imgs檔案夾中

同樣我們要先實作一個在一個tmp檔案夾下建立檔案夾的方法

-(NSString *)createDirInTmp:(NSString *)dirName{
    NSString *tmpPath=NSTemporaryDirectory();
    NSString *dirPath=[tmpPath stringByAppendingPathComponent:dirName];
    NSFileManager *fileManager=[NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:dirPath]) {
        NSError *error;
        BOOL isSucess=[fileManager  createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error];

        if(!isSucess){
            NSLog(@"error = %@",error.debugDescription);
        }
    }
    return dirPath;
}
           

然後我們對指定的圖檔路徑建立一個數組儲存,通過循環分别對它們進行下載下傳:

NSString *imgsDocumentsPath=[self createDirInTmp:@"Imgs"]; 
NSArray *[email protected][@"http://d.hiphotos.baidu.com/image/pic/item/6a63f6246b600c331c964cf21d4c510fd9f9a119.jpg",@"http://c.hiphotos.baidu.com/image/pic/item/023b5bb5c9ea15ce9c017233b1003af33a87b219.jpg",@"http://f.hiphotos.baidu.com/image/pic/item/e1fe9925bc315c60d916f9d58ab1cb134954770d.jpg"];
if (imgsDocumentsPath !=nil) {
    for (int i=; i<imgsArray.count; i++) {
        NSString *imgsString=[imgsArray[i] lastPathComponent];
        //每一張圖檔的路徑
        NSString *imgsPath=[imgsDocumentsPath stringByAppendingPathComponent:imgsString];
        //如果檔案夾中不存在該路徑
        NSFileManager *fileManager=[NSFileManager defaultManager];
        if(![fileManager fileExistsAtPath:imgsPath]){
            //将每張圖檔的URL進行編碼
            //[imgsArray[i] stringByAddingPercentEscapesUsingEncoding:4];
            NSString *urlString=[imgsArray[i] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
            NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: urlString]];
            if (data ==nil) {
                NSLog(@"網絡有問題,請稍後再下載下傳");
            }
            else{
                BOOL isSucess=[data writeToFile:imgsPath atomically:YES];
                if (isSucess) {
                    NSLog(@"圖檔下載下傳成功");
                }
                else{
                    NSLog(@"圖檔下載下傳失敗");
                }
            }
        }
        else{
            NSLog(@"圖檔已存在");
        }
    }
}