OC语言基础十:OC文件操作
文章目錄
- 主要的類
- NSFileManager
- 創建文件管理類單例對象:
- 創建目錄
- 定義帶參宏
- 附帶中間路徑
- 創建文件
- 路徑遍歷
- 淺度遍歷
- 深度遍歷
- 文件移動
- 復制操作
- 刪除操作
- 查看屬性
- 查看文件是否在路徑下存在
- NSFileHandle
- 打開文件
- 讀取文件
- 寫入數據
- 文件數據的同步
- 光標移動
- 關閉文件
主要的類
NSFileManager:文件管理類,當我們要去創建目錄,或者操作目錄中某些文件的時候,或者想查看某個目錄或者文件的屬性。
NSFileHandle:如果操作對象是某個文件,并在里面進行文本的編輯。
NSFileManager
創建文件管理類單例對象:
NSFileManager *fileManger=[NSFileManager defaultManager];創建目錄
:第一個參數:文件夾目錄
第二個參數:是否附帶中間路徑,也就是在目錄之前可能生成一些中間目錄出來,YES附帶,NO不附帶,如果要在第一個參數目錄后面連續添加目錄,則必須為YES.比如:/Users/chao/Desktop/FileOperation/Test/Test1
第三個參數:目錄屬性,一般用系統默認提供給我們的,一般傳nil
第四個參數:如果目錄創建失敗,返回為什么創建失敗了,以便于我們去完成一些異常操作。是一個二級指針。
返回是一個BOOL值,也能幫助我們判斷路徑是創建成功了還是失敗了。
將文件夾拖動到xcode界面,會在文檔里自動生成該文件夾的路徑。
NSError *error=nil; BOOL ret=[fileManager createDirectoryAtPath:@"/Users/chao/Desktop/FileOperation/Test" withIntermediateDirectories:NO attributes:nil error:&error]; if(ret){NSLog(@"目錄創建成功"); }else{NSLog(@"目錄創建失敗,reason:%@",error); }定義帶參宏
為了后續操作路徑方便,對多次使用的同一個路徑,可以寫在一個宏定義當中。首先確定變量是什么,不變的量是什么。父路徑是不變的,可變的是子路徑,到底是創建目錄呢,還是創建文件。
使用的時候,用到字符串拼接,或者格式化字符串的方法。
#import <Foundation/Foundation.h>#define kPathAtFileOperation(subpath) \[NSString stringWithFormat:@"/Users/chao/Desktop/FileOperation/%@",subpatch]//main NSError *error=nil; BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test") withIntermediateDirectories:NO attributes:nil error:&error]; if(ret){NSLog(@"目錄創建成功"); }else{NSLog(@"目錄創建失敗,reason:%@",error); }附帶中間路徑
test1和test1-1之前都沒有生成過,此時第二個參數要寫成YES,如果寫成NO的話,程序不會識別中間的test1。
BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test1/test1-1") withIntermediateDirectories:YES attributes:nil error:&error];創建文件
文件路徑肯定是帶 .文件類型 的。
contents參數接的是文件的內容,NSData類型,如果傳nil,那么文件內容就是空的。
當多次創建相同的文件時,會進行覆蓋操作。
NSString *string=@"文件操作"; NSData *data=[string dataUsingEncoding:NSUTF8StringEncoding]; ret=[fileManager createFileAtPath:kPathAtFileOperation(@"test.txt") contents:data attributes:nil];路徑遍歷
淺度遍歷
第一個參數:要遍歷的路徑。返回結果是NSArray類型的,會把目錄下的所有內容全部列舉出來。隱藏文件一般都是.開頭的
NSArray *contents=[fileManager contentsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];結果:
“.DS_Store”,
test,
“test.txt”,
test1
深度遍歷
contents=[fileManager subpathsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];結果:
“.DS_Store”,
test,
“test.txt”,
test1,
“test1/.DS_Store”,
“test1/test1-1”
淺度遍歷的結果,在深度遍歷里都可以找到。文件結構中所有的節點都會掃描一遍。所以淺度效率要高一些,深度遍歷在路徑復雜的時候,耗時會久一些。
文件移動
[fileManager moveItemAtPath:kPathAtFileOperation(@"test.txt") toPath:kPathAtFileOperation(@"test/test.txt") error:nil];復制操作
[fileManager copyItemAtPath:kPathAtFileOperation(@"test/test.txt") toPath:@"/Users/chao/Desktop/FileOperation" error:nil];刪除操作
[fileManager removeItemAtPath:kPathAtFileOperation(@"test.txt") error:nil];查看屬性
返回結果是字典NSDictionary類
NSDictionary *dictionary=[fileManager attributesOfItemAtPath:kPathAtFileOperation(@"test/test.txt") error:nil];查看文件是否在路徑下存在
if(fileManager fileExistsAtPath:kPathAtFileOperation(@"test/test.txt")){NSLog(@"YES"); }else{NSLog(@"NO"); }NSFileHandle
打開文件
只讀,不可寫:
NSFileHandle * = [NSFileHandle fileHandleForReadingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"]; NSLog(@"%@",[fileHandle readDataToEndOffFile]);//從光標的位置讀到文件末尾,如果不去操作光標位置,那么光標默認是在文件的最前面。讀出的是二進制數據,要轉換一下才能看到有意義的字符串只寫,不可讀:
NSFileHandle * = [NSFileHandle fileHandleForWritingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"];可讀,可寫:
NSFileHandle * = [NSFileHandle fileHandleForUpdatingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"];讀取文件
NSLog(@"%@",[fileHandle readDataToEndOffFile]); NSLog(@"%@",[fileHandle readDataToEndOffFile]);第二次輸出為空,因為每次去調取讀取文件相關方法的時候,都會導致光標的移動。
讀取指定長度的數據:
[fileHandle readDataOfLength:1];寫入數據
寫入的是NSData數據。
string的dataUsingEncoding方法,字符串轉NSData
文件數據的同步
在進行了文件數據的修改后,可以手動調用synchronizeFile方法,來完成數據的同步,這是很常用的。
[fileHandle synchronizeFile];光標移動
offset是光標的偏移量,當offset為0,光標就會設置到文件開頭。
[fileHandle seekToFileOffset:0];關閉文件
每次打開文件,操作完成后,必須關閉文件。關閉之后就不能繼續進行操作了。
[NSFileHandle closeFile];總結
以上是生活随笔為你收集整理的OC语言基础十:OC文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tar 打包 . 开头的隐藏文件
- 下一篇: 采用状态空间法求解八数码问题