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(@"圖檔已存在");
}
}
}