前言
@interface NSFileManager : NSObject
@interface NSFileHandle : NSObject <NSSecureCoding>
- NSFileManager 是 Foundation 框架中用來管理和操作文件、目錄等文件系統相關聯內容的類。
1、路徑操作
// 文件管理器對象,單例類對象
NSFileManager *nfManager = [NSFileManager defaultManager];
NSURL *folderUrl = [NSURL URLWithString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/testFolder"]];
NSURL *filerUrl = [NSURL URLWithString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/testFile.txt"]];
NSURL *srcUrl = [NSURL URLWithString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/testFile.txt"]];
NSURL *dstUrl = [NSURL URLWithString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/testFolder/testFile.txt"]];
// 用於保存錯誤信息
NSError *errorInfo = nil;
// 創建文件夾
/*
-(BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates
attributes:(NSDictionary *)attributes
error:(NSError **)error;
path:文件夾路徑
createIntermediates:是否連同上一級路徑一起創建,NO 並且上一級文件路徑不存在時會創建失敗。
attributes:文件夾屬性,nil 系統默認屬性
error:保存錯誤原因
BOOL:文件夾創建成功時返回值為 YES
*/
BOOL bl1 = [nfManager createDirectoryAtPath:[folderUrl path] withIntermediateDirectories:YES
attributes:nil
error:&errorInfo];
// 創建文件
/*
-(BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
path:文件路徑
data:文件內容,nil 空
attr:文件屬性,nil 系統默認屬性
BOOL:文件創建成功時返回值為 YES
*/
BOOL bl2 = [nfManager createFileAtPath:[filerUrl path]
contents:[@"北京歡迎您" dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
// 拷貝文件
/*
如果 dstUrl 路徑文件已存在,該方法會終止拷貝,並返回 false。
如果 srcUrl 的最后一部分是符號鏈接,那么只有鏈接會被拷貝到新路徑。
*/
BOOL bl3 = [nfManager copyItemAtPath:[srcUrl path] toPath:[dstUrl path] error:nil];
// 刪除文件
/*
刪除成功或者 url 為 nil 時返回 true,如果發生錯誤返回 false。如果使用 delegate
終止了刪除文件,則返回 true,如果使用 delegate 終止了刪除目錄,則返回 false
*/
BOOL bl4 = [nfManager removeItemAtPath:[dstUrl path] error:nil];
// 移動文件
/*
如果 dstUrl 路徑文件已存在,該方法會終止移動,並返回 false。如果 srcUrl 的最后
一部分是符號鏈接,那么只有鏈接會被移動到新路徑。鏈接所指向的內容仍然保持在現有的位置。
*/
BOOL bl5 = [nfManager moveItemAtPath:[srcUrl path] toPath:[dstUrl path] error:nil];
// 查找滿足指定條件的路徑
// 返回其 URL。該方法不但可以獲得標准系統目錄,還可以用來創建臨時路徑
NSURL *url1 = [nfManager URLForDirectory:NSDocumentDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:nil];
// 返回所有滿足條件的路徑列表
NSArray *urlObjs = [nfManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *url2 = urlObjs[0];
// 查詢指定路徑下的所有子路徑
NSArray *urls1 = [nfManager subpathsAtPath:[url1 path]];
NSArray *urls2 = [nfManager subpathsOfDirectoryAtPath:[url1 path] error:nil];
// 淺遍歷
// 返回指定目錄下的文件、子目錄及符號鏈接的列表
NSArray *contentsDir1 = [nfManager contentsOfDirectoryAtPath:[url1 path] error:nil];
// 返回的是文件全路徑
NSArray *contentsDir2 = [nfManager contentsOfDirectoryAtURL:url1
includingPropertiesForKeys:nil
options:NSDirectoryEnumerationSkipsHiddenFiles
error:nil];
// 深遍歷
// 返回指定目錄下的所有文件及其子目錄下的所有元素路徑
NSDirectoryEnumerator *enumeratorDir1 = [nfManager enumeratorAtPath:[url1 path]];
// 返回的是文件全路徑
NSDirectoryEnumerator *enumeratorDir2 = [nfManager enumeratorAtURL:url1
includingPropertiesForKeys:nil
options:NSDirectoryEnumerationSkipsHiddenFiles
errorHandler:nil];
// 枚舉遍歷深層遍歷
NSDirectoryEnumerator *dEnu = [nfManager enumeratorAtPath:[url1 path]];
id obj = nil;
while (obj = [dEnu nextObject]) {
NSLog(@"%@", obj);
}
// 顯示路徑的本地化名稱
/*
// 如果指定的文件或目錄不存在,會返回 path 本身
*/
NSString *displayName = [nfManager displayNameAtPath:[url1 path]];
// 獲取指定路徑的各種屬性
NSDictionary *attributes = [nfManager attributesOfItemAtPath:[url1 path] error:nil];
// 獲取指定路徑文件的內容數據
/*
如果指定路徑為目錄或發生錯誤,返回 nil
*/
NSData *data = [nfManager contentsAtPath:[[url1 path] stringByAppendingString:@"/test.txt"]];
// 獲取當前路徑
NSString *currentPath = [nfManager currentDirectoryPath];
// 更改當前路徑
/*
/Users/JHQ0228/Desktop/Debug
*/
BOOL bl6 = [nfManager changeCurrentDirectoryPath:[NSHomeDirectory() stringByAppendingString:@"/Desktop/Debug"]];
// 獲取臨時工作路徑
/*
獲取系統中可以用來創建臨時文件的目錄路徑名,一定要在完成任務之后將在其中創建的文件刪除
*/
NSString *tempPath = NSTemporaryDirectory();
// 獲取用戶主路徑(沙盒路徑)
NSString *homePath = NSHomeDirectory();
// 獲取指定用戶的主路徑
/*
NSUserName(); 獲取當前用戶的登錄名。NSFullUserName(); 獲取當前用戶完整用戶名
*/
NSString *userHomePath = NSHomeDirectoryForUser(NSUserName());
// 獲取用戶 Documents 路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// 獲取 app 包路徑
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
// 創建一個新路徑
BOOL bl8 = [nfManager createDirectoryAtPath:[NSHomeDirectory() stringByAppendingString:@"/Desktop/Debug1"]
withIntermediateDirectories:YES
attributes:nil
error:nil];
// 判斷文件是否為路徑(flag 中存儲結果 YES/NO)
// 存儲判斷結果
BOOL result;
BOOL bl9 = [nfManager fileExistsAtPath:[NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]
isDirectory:&result];
// 判斷是否是根路徑(絕對路徑)
/*
路徑以 “/” 開始的為根路徑
*/
BOOL bl10 = [@"../Desktop/test.txt" isAbsolutePath];
// 獲取最后一個路徑
NSString *lastPath = [[NSHomeDirectory() stringByAppendingString:@"/Desktop"] lastPathComponent];
// 刪除最后一個路徑
NSString *deleteLastPath = [[NSHomeDirectory() stringByAppendingString:@"/Desktop"] stringByDeletingLastPathComponent];
// 拼接一個路徑
NSString *appendingPath = [[NSHomeDirectory() stringByAppendingString:@"/Desktop"] stringByAppendingPathComponent:@"testFolder"];
// 文件路徑分割
NSArray *pathArray = [[NSHomeDirectory() stringByAppendingString:@"/Desktop"] pathComponents];
// 文件路徑組合
NSString *pathString = [NSString pathWithComponents:pathArray];
// 將路徑中的代字符 ~ 擴展成用戶主目錄或指定用戶的主目錄
// 特殊的代字符 ~ 是用戶主目錄(如:/Users/JHQ0228)的縮寫,~linda 表示用戶 linda 主目錄的縮寫
NSString *path1 = @"~/Desktop/test.txt";
// /Users/JHQ0228/Desktop/test.txt
NSString *mainPath = [path1 stringByExpandingTildeInPath];
// 解析路徑中的符號鏈接
// /.. 上一級目錄
NSString *path2 = @"~/../Debug";
// 通過解析 ~(用戶主目錄)、..(父目錄) 、.(當前目錄)和符號鏈接來標准化路徑
NSString *appPath1 = [path2 stringByResolvingSymlinksInPath];
// NSHomeDirectory()/.. NSHomeDirectory() 的上一級目錄
NSString *path3 = [NSString stringWithFormat:@"%@/../Debug", NSHomeDirectory()];
NSString *appPath2 = [path3 stringByStandardizingPath];
// 獲取文件拓展名
NSString *getExtension = [@"/Desktop/test.txt" pathExtension];
// 刪除文件拓展名
NSString *deleteExtension = [@"/Desktop/test.txt" stringByDeletingPathExtension];
// 拼接文件拓展名
NSString *appendingExtension = [@"/Desktop/test.txt" stringByAppendingPathExtension:@"doc"];
// 獲取文件大小
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filerUrl.path error:NULL];
long long fileSize = [dict[NSFileSize] longLongValue];
long long fileSize = [dict fileSize];
2、路徑判斷
NSFileManager *nfManager = [NSFileManager defaultManager];
NSURL *url1 = [nfManager URLForDirectory:NSDocumentDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:YES
error:nil];
// 判斷路徑是否存在
/*
如果當前路徑以~開頭,需使用 NSString 的 stringByExpandingTildeInPath 方法進行處理,否則會返回 false
*/
BOOL bl1 = [nfManager fileExistsAtPath:[url1 path]];
// 判斷指定路徑是否有可讀權限
BOOL bl2 = [nfManager isReadableFileAtPath:[url1 path]];
// 判斷指定路徑是否有可寫權限
BOOL bl3 = [nfManager isWritableFileAtPath:[url1 path]];
// 判斷指定路徑是否有可執行權限
BOOL bl4 = [nfManager isExecutableFileAtPath:[url1 path]];
// 判斷指定路徑是否有可刪除權限
BOOL bl5 = [nfManager isDeletableFileAtPath:[url1 path]];
// 判斷兩個指定路徑的內容是否相同
BOOL bl6 = [nfManager contentsEqualAtPath:[url1 path] andPath:[[url1 path] stringByAppendingString:@"/test.txt"]];
3、文件操作
NSURL *fileUrl = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0];
// 文件打開
NSFileHandle *nfHandle = [NSFileHandle fileHandleForUpdatingAtPath:[[fileUrl path] stringByAppendingString:@"/test.txt"]];
NSFileHandle *nfHandle1 = [NSFileHandle fileHandleForReadingAtPath:[[fileUrl path] stringByAppendingString:@"/test.txt"]];
NSFileHandle *nfHandle2 = [NSFileHandle fileHandleForWritingAtPath:[[fileUrl path] stringByAppendingString:@"/test.txt"]];
// 文件句柄偏移量
// 獲取文件句柄指針的偏移量
unsigned long long offSetNum1 = [nfHandle offsetInFile];
// 將偏移量移到文件末尾,返回移動后的指針偏移量
unsigned long long offSetNum2 = [nfHandle seekToEndOfFile];
// 將偏移量指向特定的位置
[nfHandle seekToFileOffset:0];
// 文件讀取
// 獲取當前文件句柄的可用數據,獲取后指針移到文件末尾
NSData *availableData = [nfHandle availableData];
// 獲取從當前指針位置到文件結束的所有數據,獲取后指針移到文件末尾
NSData *data1 = [nfHandle readDataToEndOfFile];
// 獲取從當前指針位置開始讀取的 length 長度的數據內容,獲取后指針移到文件讀取到的位置
NSData *data2 = [nfHandle readDataOfLength:10];
// 文件寫入
// 從當前指針位置寫入數據到文件
[nfHandle writeData:[@"你好" dataUsingEncoding:NSUTF8StringEncoding]];
// 文件關閉
// 關閉文件
[nfHandle closeFile];
// 文件比較
NSFileManager *nfManager = [NSFileManager defaultManager];
// 文件路徑
NSString *filePath1 = [NSHomeDirectory() stringByAppendingString:@"/Desktop/file1.txt"];
NSString *filePath2 = [NSHomeDirectory() stringByAppendingString:@"/Desktop/file2.txt"];
[nfManager createFileAtPath:filePath1
contents:[@"北京歡迎您" dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
[nfManager createFileAtPath:filePath2
contents:[@"北京歡迎" dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
// 比較兩個文件的內容是否相等
BOOL bl = [nfManager contentsEqualAtPath:filePath1 andPath:filePath2];