iOS SDK詳解之NSFileManager
前言:NSFileManager提供了一種方便的方式進行檔案操作,包括檔案和目錄的建立,拷貝,剪下,刪除等。
本文會詳細講解如何進行這些最基本的操作。
要注意的幾點使用defaultManager的時候,實際上擷取的是一個單例(同一個對象),是安全執行緒的,絕大多數時候,使用這個就可以了。本文講解基礎操作的時候,就使用這個。 如果在不同線程中使用,而且需要代理函數來監聽事件,這時候要使用init來建立每個線程獨立的fileManager定位
說白了,就是擷取一些目錄。主要就是兩個函數
只是定位
- URLsForDirectory:inDomains:
舉例
擷取library目錄(預設存在)
NSFileManager * fileManager = [NSFileManager defaultManager]; NSArray * searchResult = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]; NSURL * documentPath = [searchResult firstObject]; NSLog(@%@,documentPath);
定位的時候可以建立
- URLForDirectory:inDomain:appropriateForURL:create:error:
擷取Application Support(預設不存在)
NSFileManager * fileManager = [NSFileManager defaultManager]; NSURL * path = [fileManager URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil]; NSLog(@%@,path);
這裡要提到的幾個常用參數
NSLibraryDirectory - Library目錄 NSApplicationSupportDirectory - Library/Application Support目錄 NSDocumentDirectory - Document 目錄 NSUserDomainMask - 使用者域
至於,哪個域儲存什麼東西,參見我之前寫的關於沙箱的文章
http://blog.csdn.net/hello_hwc/article/details/44916909判斷檔案/目錄是否存在
兩個函數
第二個函數還有一個額外輸出,如果這個檔案存在的話,會給出這個檔案是不是目錄檔案
- fileExistsAtPath:- fileExistsAtPath:isDirectory:
NSFileManager * fileManager = [NSFileManager defaultManager]; NSArray * searchResult = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]; NSURL * documentPath = [searchResult firstObject]; NSString * newPath = [documentPath.path stringByAppendingPathComponent:@Demo/Wenchen]; if ([fileManager fileExistsAtPath:newPath] == false) { NSLog(@Path not exist); } BOOL isDic; if ([fileManager fileExistsAtPath:documentPath.path isDirectory:&isDic] == false) { NSLog(@Path not exist); } NSLog(@%d,isDic);
建立
建立目錄
兩個函數參數類似,只不過第一個參數的類型不同
-createDirectoryAtURL:withIntermediateDirectories:attributes:error:- createDirectoryAtPath:withIntermediateDirectories:attributes:error:
返回Bool來反映操作是否成功,如果出錯,錯誤資訊在error裡
第二個參數代表是否自動建立不存在父目錄(也就是一次建立多層目錄)
第三個參數用來設定存取權限,通常為nil
舉例
NSFileManager * fileManager = [NSFileManager defaultManager]; NSArray * searchResult = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]; NSURL * documentPath = [searchResult firstObject]; NSString * newPath = [documentPath.path stringByAppendingPathComponent:@Demo/Wenchen]; if ([fileManager fileExistsAtPath:newPath] == false) { [fileManager createDirectoryAtPath:newPath withIntermediateDirectories:YES attributes:nil error:nil]; }
然後,開啟沙箱,看到了建立成功
建立檔案
使用函數
這裡的attributes除非想要設定一些讀寫權限,否則nil
- createFileAtPath:contents:attributes:
返回Bool來反映操作是否成功,如果出錯,錯誤資訊在error裡
這個檔案後面要用的
NSFileManager * fileManager = [NSFileManager defaultManager]; NSArray * searchResult = [fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]; NSURL * documentPath = [searchResult firstObject]; NSString * newPath = [documentPath.path stringByAppendingPathComponent:@Demo/Wenchen]; if ([fileManager fileExistsAtPath:newPath] == false) { [fileManager createDirectoryAtPath:newPath withIntermediateDirectories:YES attributes:nil error:nil]; } NSString * filePath = [newPath stringByAppendingPathComponent:@file.txt]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@blog.csdn.net/hello_hwc]; [fileManager createFileAtPath:filePath contents:data attributes:nil];
查看沙箱,確認建立成功
注意,使用一些諸如writeToFile的時候,如果檔案不存在,是會自動建立的。
拷貝/移動 檔案
使用函數
- copyItemAtURL:toURL:error:- copyItemAtPath:toPath:error:- moveItemAtURL:toURL:error:- moveItemAtPath:toPath:error:
返回Bool來反映操作是否成功,如果出錯,錯誤資訊在error裡
舉例
NSFileManager * fileManager = [NSFileManager defaultManager]; NSURL * libraryPath = [[fileManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask]firstObject]; NSURL * documentPath = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]firstObject]; NSString * oldPath = [libraryPath.path stringByAppendingPathComponent:@Demo/Wenchen/file.txt]; NSString * newPath = [documentPath.path stringByAppendingPathComponent:@file.txt]; [fileManager copyItemAtPath:oldPath toPath:newPath error:nil];
查看沙箱,拷貝成功
刪除
NSFileManager * fileManager = [NSFileManager defaultManager]; NSURL * documentPath = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]firstObject]; NSString * newPath = [documentPath.path stringByAppendingPathComponent:@file.txt]; Bool success = [fileManager removeItemAtPath:newPath error:nil];