前言瞎扯
我們?cè)谧鲰?xiàng)目過程中難免會(huì)接觸到存儲(chǔ)文件這種操作叁丧,那么必然會(huì)和NSFileManager發(fā)生關(guān)系(你們想歪了剪撬,真邪惡~~~)
代碼預(yù)覽
那先貼一下代碼吧:
1>這個(gè)是直接給一個(gè)目錄,一般用在將文件輸出到桌面上好查看會(huì)直接這樣用:
NSFileManager *fileManager = [NSFileManager defaultManager];
//查找目錄漓穿,如果沒有就創(chuàng)建一個(gè)目錄
if (![fileManager fileExistsAtPath:path]) {
//BOOL isSuccess = [fileManager createFileAtPath: path contents:nil attributes:nil];
NSError *error = nil;
BOOL isSuccess = [fileManager createDirectoryAtPath: path withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"error = %@",error);
NSLog(@"isSiccess = %d",isSuccess);
}
NSString *filePath = [NSString stringWithFormat:@"%@/helloword.txt",path ];
NSLog(@"filePath = %@",filePath);
NSError *error = nil;
BOOL isSuccess = [file writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (isSuccess && error == nil) {
NSLog(@"存儲(chǔ)成功!W⒂晃危!");
}else{
NSLog(@"error = %@",error);
NSLog(@"存儲(chǔ)失敗@峡汀A欧埂!");
}
PS: 注釋掉的這個(gè)方法如果path是文件路徑就創(chuàng)建胧砰,如果path是一個(gè)目錄鳍鸵,判定沒有的話就調(diào)用下面這句話創(chuàng)建目錄
//創(chuàng)建文件
BOOL isSuccess = [fileManager createFileAtPath:filePath contents:nil attributes:nil];
//創(chuàng)建目錄
BOOL isSuccess = [fileManager createDirectoryAtPath:newDir withIntermediateDirectories:YES attributes:nil error:&error];
PS: 創(chuàng)建目錄是可以傳一個(gè)error進(jìn)去的,這樣如果報(bào)錯(cuò)是可以看error的
2>如果是存儲(chǔ)在手機(jī)上尉间,一般會(huì)這么做:
NSFileManager *fileManager = [NSFileManager defaultManager];
//創(chuàng)建document路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath = [NSString stringWithFormat:@"%@/helloword.txt",path];
//查找文件偿乖,如果沒有就創(chuàng)建一個(gè)文件
if (![fileManager fileExistsAtPath: filePath]) {
BOOL isSuccess = [fileManager createFileAtPath:filePath contents:nil attributes:nil];
NSLog(@"isSiccess = %d",isSuccess);
}
NSError *error = nil;
BOOL isSuccess = [file writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (isSuccess && error == nil) {
NSLog(@"存儲(chǔ)成功!U艹啊贪薪!");
}else{
NSLog(@"error = %@",error);
NSLog(@"存儲(chǔ)失敗C吒薄;小!");
}
錯(cuò)誤解決
1>報(bào)錯(cuò)如下:
主要報(bào)錯(cuò):
"Operation not permitted"
詳細(xì)報(bào)錯(cuò):
filePath = /Users/KODIE/Desktop/JunkCode/KODOjljwfFyvdxgObject.m
2017-08-17 14:07:51.139040+0800 KODJunkCodeCreateDemo[12477:6111819] error = Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “KODOjljwfFyvdxgObject.m” in the folder “JunkCode”." UserInfo={NSFilePath=/Users/KODIE/Desktop/JunkCode/KODOjljwfFyvdxgObject.m, NSUnderlyingError=0x170443a50 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
PS: 這個(gè)是沒有權(quán)限在該路徑下創(chuàng)建文件囱怕,這個(gè)問題發(fā)生的原因是我平常喜歡用模擬器來調(diào)試霍弹,會(huì)把文件寫在桌面上,但是呢由于今天不知道怎么回事開了模擬器就卡死了娃弓,所以我就用真機(jī)跑了典格,但是沒有注意到只有模擬器才能把文件寫到桌面上或者說電腦上,所以我一直也找不到什么原因忘闻,后面Google百度了好久查的煩了冷靜的想了下才知道钝计,咳,有時(shí)候也不要盲目搜啊...
2>報(bào)錯(cuò)如下:
主要報(bào)錯(cuò):
"No such file or directory"
詳細(xì)報(bào)錯(cuò):
Error Domain=NSCocoaErrorDomain Code=4 "The folder “KODKxqugQqqwcObject.m” doesn’t exist." UserInfo={NSFilePath=/Users/KODIE/Desktop/JunkCode/KODKxqugQqqwcObject.m, NSUserStringVariant=Folder, NSUnderlyingError=0x60000024e820 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
PS: 這個(gè)是寫文件的時(shí)候保存的時(shí)候沒有創(chuàng)建目錄齐佳,就是說寫文件的時(shí)·候目錄沒有創(chuàng)建私恬,主要是用了以下直接判斷文件,而并不是判斷目錄創(chuàng)建目錄,解決辦法是用下面的代碼改成判斷文件所在的目錄有沒有創(chuàng)建,沒有就創(chuàng)建:
if (![fileManager fileExistsAtPath: filePath]) {
BOOL isSuccess = [fileManager createFileAtPath:filePath contents:nil attributes:nil];
NSLog(@"isSiccess = %d",isSuccess);
}
3>報(bào)錯(cuò)如下:
主要報(bào)錯(cuò):
"Is a directory"
詳細(xì)報(bào)錯(cuò):
Error Domain=NSCocoaErrorDomain Code=512 "The file “KODOhwalUlwxsrObject.h” couldn’t be saved in the folder “JunkCode”." UserInfo={NSFilePath=/Users/KODIE/Desktop/JunkCode/KODOhwalUlwxsrObject.h, NSUnderlyingError=0x608000053ec0 {Error Domain=NSPOSIXErrorDomain Code=21 "Is a directory"}}
PS: 寫文件的時(shí)候炼吴,這是一個(gè)目錄并不是一個(gè)文件本鸣,可能調(diào)用錯(cuò)了方法,這個(gè)很有可能是因?yàn)槲覀儼盐募窂疆?dāng)成是目錄路徑來判斷了,所以直接創(chuàng)建了一個(gè)目錄硅蹦,可能調(diào)用的方法是如下但是path卻是文件路徑:
if (![fileManager fileExistsAtPath:path]) {
NSError *error = nil;
BOOL isSuccess = [fileManager createDirectoryAtPath: path withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"error = %@",error);
NSLog(@"isSiccess = %d",isSuccess);
}
使用建議
在使用的過程中我建議是這樣的荣德,先把文件所需要在的路徑判斷一下是否有這個(gè)目錄存在闷煤,如果不存在創(chuàng)建這個(gè)目錄(這個(gè)目錄是可以創(chuàng)建多級(jí)的),然后我們?cè)賹懭氲铰窂较碌奈募锶ヤ陶埃@樣不會(huì)有錯(cuò)的鲤拿。
NSString *dirPath = @"/Users/你的電腦名/Desktop/HelloWord";
NSString *filePath = [NSString stringWithFormat:@"%@//helloword.txt",dirPath];
NSLog(@"filePath = %@",filePath);
NSFileManager *fileManager = [NSFileManager defaultManager];
//查找目錄,如果沒有就創(chuàng)建一個(gè)目錄
if (![fileManager fileExistsAtPath: dirPath]) {
NSError *error = nil;
BOOL isSuccess = [fileManager createDirectoryAtPath: dirPath withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"error = %@",error);
NSLog(@"isSiccess = %d",isSuccess);
}
NSError *error = nil;
BOOL isSuccess = [file writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (isSuccess && error == nil) {
NSLog(@"存儲(chǔ)成功J鹧省=辍!");
}else{
NSLog(@"error = %@",error);
NSLog(@"存儲(chǔ)失斈瘛V仙!慕匠!");
}
文末推薦