NSFileHandle 簡介
NSFileHandle 提供檔案層級的讀寫操作,配合 NSFileManager(檔案管理:建立、刪除、移動)構成完整的檔案 I/O 體系。核心流程三步驟:
- 建立
NSFileHandle 物件(指定路徑與模式)
- 執行讀/寫/定位/截斷等操作
- 呼叫
closeFile 關閉
常用類別方法(建立句柄)
| 方法 | 用途 |
fileHandleForReadingAtPath: | 唯讀開啟 |
fileHandleForWritingAtPath: | 唯寫開啟 |
fileHandleForUpdatingAtPath: | 讀寫開啟 |
常用實例方法
| 方法 | 說明 |
availableData | 回傳可讀資料 (NSData) |
readDataToEndOfFile | 從目前位置讀到檔尾 |
readDataOfLength: | 讀取指定長度 |
writeData: | 寫入 NSData |
offsetInFile | 取得目前偏移量 |
seekToEndOfFile | 移動到檔尾 |
seekToFileOffset: | 移動到指定偏移 |
truncateFileAtOffset: | 截斷檔案長度 |
synchronizeFile | 同步快取到磁碟 |
closeFile | 關閉檔案 |
實戰範例
1. 追加資料到檔案
@autoreleasepool {
NSString *home = NSHomeDirectory();
NSString *path = [home stringByAppendingFormat:@"/Desktop/testfile"];
NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:path];
[fh seekToEndOfFile];
NSString *str = @"測試加入的資料";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[fh writeData:data];
[fh closeFile];
}
2. 定位讀取檔案後半段
NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/Desktop/testfile"];
NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:path];
NSUInteger len = [fh availableData].length;
[fh seekToFileOffset:len/2];
NSData *data = [fh readDataToEndOfFile];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", str);
3. 複製檔案內容
NSString *src = [NSHomeDirectory() stringByAppendingFormat:@"/Desktop/testfile"];
NSString *dst = [NSHomeDirectory() stringByAppendingFormat:@"/Desktop/outfile"];
[[NSFileManager defaultManager] createFileAtPath:dst contents:nil attributes:nil];
NSFileHandle *in = [NSFileHandle fileHandleForReadingAtPath:src];
NSFileHandle *out = [NSFileHandle fileHandleForWritingAtPath:dst];
NSData *all = [in availableData];
[out writeData:all];
[in closeFile]; [out closeFile];
NSData 常用轉換方法
dataUsingEncoding: 字串 → NSData
initWithData:encoding: NSData → 字串
bytes 取得原始 const void* 指標
length 取得位元組長度
注意事項
- 所有路徑需為完整絕對路徑(可用
NSHomeDirectory() 組合)。
- 讀寫大檔案時建議分塊處理,避免一次
availableData 佔用過多記憶體。
- 寫入後務必
synchronizeFile 或 closeFile 確保資料落盤。