iOS 關于文件操作 NSFileManager

參考鏈接:http://www.lxweimin.com/p/086ca6d2c5de

1.沙盒機制

處于安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如在用戶授權情況下訪問通訊錄,相冊等),這個規則展示了iOS系統的封閉性。在開發中常常需要數據存儲的功能,比如存取文件,歸檔解檔等。

每一個iOS應用程序都會為自己創建一個文件系統目錄,這個獨立、封閉、安全的空間叫做沙盒。沙盒就是一種安全體系,它規定了應用程序只能在自己的文件系統目錄內訪問文件,不可以訪問其他應用沙盒內的內容。所有的非代碼文件都保存在這個地方。

沙盒根目錄結構:Documents、Library、temp

沙盒目錄

Documents

保存應用運行時生成的需要持久化的數據,iTunes備份和恢復的時候會包括此目錄,所以蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下。

Library

Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出后刪除 。一般存放體積比較大,不是特別重要的資源。

Preferences:保存APP的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息,iTunes會自動備份該目錄。注意:通過NSUserDefaults類來讀取和設置。

tmp

保存應用運行時所需的臨時數據,這個可以放一些當APP退出后不再需要的文件。應用沒有運行時,系統也有可能會清除該目錄下的文件,iTunes不會同步該目錄。iPhone重啟時,該目錄下的文件會被刪除。

如何查看該目錄?

XCode->Window->Devices->真機->Installed Apps->應用->ShowContainer

沙盒目錄

也可以點擊DownloadContainer下載該沙盒文件查看內容

沙盒內容

獲取相關目錄

// 獲取Document目錄NSString*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];// 獲取Library目錄NSString*LibraryPath=[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES)lastObject];// 獲取Caches目錄NSString*cachesPath=[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)lastObject];// 獲取Preferences目錄 通常情況下,Preferences有系統維護,所以我們很少去操作它。NSString*preferPath=[LibraryPath stringByAppendingPathComponent:@"Preferences"];// 獲取tmp目錄NSString*tmpPath=NSTemporaryDirectory();

說明:

三、NSSearchPathForDirectoriesInDomains

NSSearchPathForDirectoriesInDomains方法用于查找目錄,返回指定范圍內的指定名稱的目錄的路徑集合。有三個參數:

**directory** NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。

** * domainMask* ** NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制于當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。

** * expandTilde* ** BOOL值,表示是否展開波浪線。我們知道在iOS中的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。

該值為NO:Caches目錄路徑~/Library/Caches

該值為YES:Caches目錄路徑

/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches

[toc]

相關文件操作

--

創建文件夾

+(BOOL)creatDir:(NSString*)path{if(path.length==0){returnNO;}NSFileManager*fileManager=[NSFileManager defaultManager];BOOL isSuccess=YES;BOOL isExist=[fileManager fileExistsAtPath:path];if(isExist==NO){NSError*error;if(![fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]){isSuccess=NO;NSLog(@"creat Directory Failed:%@",[error localizedDescription]);}}returnisSuccess;}

創建文件

+(BOOL)creatFile:(NSString*)filePath{if(filePath.length==0){returnNO;}NSFileManager*fileManager=[NSFileManager defaultManager];if([fileManager fileExistsAtPath:filePath]){returnYES;}NSError*error;NSString*dirPath=[filePath stringByDeletingLastPathComponent];BOOL isSuccess=[fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error];if(error){NSLog(@"creat File Failed:%@",[error localizedDescription]);}if(!isSuccess){returnisSuccess;}isSuccess=[fileManager createFileAtPath:filePath contents:nil attributes:nil];returnisSuccess;}

寫數據

+(BOOL)writeToFile:(NSString*)filePath contents:(NSData*)data{if(filePath.length==0){returnNO;}BOOL result=[selfcreatFile:filePath];if(result){if([data writeToFile:filePath atomically:YES]){NSLog(@"write Success");}else{NSLog(@"write Failed");}}else{NSLog(@"write Failed");}returnresult;}

追加寫數據

+(BOOL)appendData:(NSData*)data withPath:(NSString*)filePath{if(filePath.length==0){returnNO;}BOOL result=[selfcreatFile:filePath];if(result){NSFileHandle*handle=[NSFileHandle fileHandleForWritingAtPath:filePath];[handle seekToEndOfFile];[handle writeData:data];[handle synchronizeFile];[handle closeFile];}else{NSLog(@"appendData Failed");}returnresult;}

讀文件數據

+(NSData*)readFileData:(NSString*)path{NSFileHandle*handle=[NSFileHandle fileHandleForReadingAtPath:path];NSData*fileData=[handle readDataToEndOfFile];[handle closeFile];returnfileData;}

獲取文件夾下所有的文件列表

+(NSArray*)getFileList:(NSString*)path{if(path.length==0){returnnil;}NSFileManager*fileManager=[NSFileManager defaultManager];NSError*error;NSArray*fileList=[fileManager contentsOfDirectoryAtPath:path error:&error];if(error){NSLog(@"getFileList Failed:%@",[error localizedDescription]);}returnfileList;}

獲取文件夾下所有文件(深度遍歷)

+(NSArray*)getAllFileList:(NSString*)path{if(path.length==0){returnnil;}NSArray*fileArray=[selfgetFileList:path];NSMutableArray*fileArrayNew=[NSMutableArray array];NSFileManager*fileManager=[NSFileManager defaultManager];for(NSString*aPathinfileArray){NSString*fullPath=[path stringByAppendingPathComponent:aPath];BOOL isDir=NO;if([fileManager fileExistsAtPath:fullPath isDirectory:&isDir]){if(isDir){[fileArrayNew addObjectsFromArray:[selfgetAllFileList:fullPath]];}else{[fileArrayNew addObject:fullPath];}}}returnfileArrayNew;}

移動文件

+(BOOL)moveFile:(NSString*)fromPath toPath:(NSString*)toPath toPathIsDir:(BOOL)dir{NSFileManager*fileManager=[NSFileManager defaultManager];if(![fileManager fileExistsAtPath:fromPath]){NSLog(@"Error: fromPath Not Exist");returnNO;}BOOL isDir=NO;BOOL isExist=[fileManager fileExistsAtPath:toPath isDirectory:&isDir];if(isExist){if(isDir){if([selfcreatDir:toPath]){NSString*fileName=fromPath.lastPathComponent;toPath=[toPath stringByAppendingPathComponent:fileName];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{[selfremoveFile:toPath];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{if(dir){if([selfcreatDir:toPath]){NSString*fileName=fromPath.lastPathComponent;toPath=[toPath stringByAppendingPathComponent:fileName];return[selfmoveItemAtPath:fromPath toPath:toPath];}}else{return[selfmoveItemAtPath:fromPath toPath:toPath];}}returnNO;}+(BOOL)moveItemAtPath:(NSString*)fromPath toPath:(NSString*)toPath{BOOL result=NO;NSError*error=nil;NSFileManager*fileManager=[NSFileManager defaultManager];result=[fileManager moveItemAtPath:fromPath toPath:toPath error:&error];if(error){NSLog(@"moveFile Fileid:%@",[error localizedDescription]);}returnresult;}

刪除文件

+(BOOL)removeFile:(NSString*)filePath{BOOL isSuccess=NO;NSError*error;NSFileManager*fileManager=[NSFileManager defaultManager];isSuccess=[fileManager removeItemAtPath:filePath error:&error];if(error){NSLog(@"removeFile Field:%@",[error localizedDescription]);}else{NSLog(@"removeFile Success");}returnisSuccess;}

刪除文件夾

+(BOOL)removeDir:(NSString*)path{return[selfremoveFile:path];}

刪除某些后綴的文件

+(void)removeFileSuffixList:(NSArray<NSString*>*)suffixList filePath:(NSString*)path deep:(BOOL)deep{NSArray*fileArray=nil;if(deep){// 是否深度遍歷fileArray=[selfgetAllFileList:path];}else{fileArray=[selfgetFileList:path];NSMutableArray*fileArrayTmp=[NSMutableArray array];for(NSString*fileNameinfileArray){NSString*allPath=[path stringByAppendingPathComponent:fileName];[fileArrayTmp addObject:allPath];}fileArray=fileArrayTmp;}for(NSString*aPathinfileArray){for(NSString*suffixinsuffixList){if([aPath hasSuffix:suffix]){[selfremoveFile:aPath];}}}}

獲取文件大小

+(longlong)getFileSize:(NSString*)path{unsignedlonglongfileLength=0;NSNumber*fileSize;NSFileManager*fileManager=[NSFileManager defaultManager];NSDictionary*fileAttributes=[fileManager attributesOfItemAtPath:path error:nil];if((fileSize=[fileAttributes objectForKey:NSFileSize])){fileLength=[fileSize unsignedLongLongValue];//單位是 B}returnfileLength;}

獲取文件的信息(包含了上面文件大小)

+(NSDictionary*)getFileInfo:(NSString*)path{NSError*error;NSDictionary*reslut=[[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error];if(error){NSLog(@"getFileInfo Failed:%@",[error localizedDescription]);}returnreslut;}

[toc]

NSFileManager和NSFileHandle

1、NSFileManager(文件管理對象)

主要是對文件進行的操作(創建/刪除/改名等)以及文件信息的獲取。

方法說明

@property (class, readonly, strong) NSFileManager *defaultManager創建文件管理對象

-(BOOL)fileExistsAtPath:(NSString *)path isDirectory:(nullable BOOL *)isDirectory判斷某個路徑是否存在,isDirectory是一個指針,表示該路徑是否是目錄

-(BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSString *, id> *)attributes error:(NSError **)error創建一個目錄

-(BOOL)createFileAtPath:(NSString *)path contents:(nullable NSData *)data attributes:(nullable NSDictionary<NSString *, id> *)attr創建一個文件,可順便寫入data

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFileNSData類型的寫入數據,讀數據請自行查閱

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)errorNSString、NSArray、NSDictionary的寫入數據,讀數據請自行查閱

-(nullable NSArray<NSString *> *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error獲取當前文件夾下的文件/目錄

-(BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error移動文件,可用來重命名

-(BOOL)copyItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL error:(NSError **)error復制文件

-(BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error刪除文件

-(nullable NSDictionary<NSFileAttributeKey, id> *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error獲取文件信息(文件大小、修改時間、所有者等)

</b>

2、NSFileHandle(文件連接器)

主要是對文件內容進行讀取和寫入操作

方法說明

+(nullable instancetype)fileHandleForWritingAtPath:(NSString *)path寫的方式打開文件

+(nullable instancetype)fileHandleForReadingAtPath:(NSString *)path讀的方式打開文件

-(unsigned long long)seekToEndOfFile跳到文件末尾

-(void)seekToFileOffset:(unsigned long long)offset跳到指定偏移位置

-(void)truncateFileAtOffset:(unsigned long long)offset將文件的長度設為offset字節

-(NSData *)readDataToEndOfFile從當前字節讀取到文件到末尾數據

-(NSData *)readDataOfLength:(NSUInteger)length從當前字節讀取到指定長度數據

-(void)synchronizeFile同步文件,通常用在寫入數據后

-(void)closeFile關閉文件

[toc]

對象等復雜類型的讀寫操作

上述數據操作,支持的類型僅僅是NSString、NSArray、NSDictionary、NSData類型,這些都數據類型都支持了NSCoding協議,可以進行數據持久化。如果我們想存儲如UIImage、自定義的對象等類型,我們都需要將其轉換為NSData類型,如轉換UIImage為NSData使用UIImagePNGRepresentation(image)等方法,而自定義對象類型則需要進行歸檔、反歸檔來進行存取操作

存:

對象->歸檔->NSData->文件寫入

取:

文件讀取->NSData->反歸檔->對象

自定義對象需要遵守NSCoding協議并實現

-(void)encodeWithCoder:(NSCoder*)aCoder;//序列化 -(id)initWithCoder:(NSCoder*)aDecoder;//反序列化

兩個方法

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文出處 http://blog.csdn.net/feng2qing/article/details/54974...
    蕭溪閱讀 3,347評論 0 0
  • 一、iOS中的沙盒機制 iOS應用程序只能對自己創建的文件系統讀取文件,這個獨立、封閉、安全的空間,叫做沙盒。它一...
    絢雨藍了個楓閱讀 4,144評論 0 2
  • 一、iOS中的沙盒機制 iOS應用程序只能對自己創建的文件系統讀取文件,這個獨立、封閉、安全的空間,叫做沙盒。它一...
    1d5cb7cff98d閱讀 1,789評論 0 0
  • iOS開發-文件管理(一) 一、iOS中的沙盒機制 iOS應用程序只能對自己創建的文件系統讀取文件,這個獨立、封閉...
    MacShare閱讀 1,816評論 0 6
  • 一、iOS中的沙盒機制 iOS應用程序只能對自己創建的文件系統讀取文件,這個獨立、封閉、安全的空間,叫做沙盒。它一...
    莫許閱讀 1,787評論 0 0