NSFileManager: 文件管理器类,用于操作文件和目录
一,创建管理对象(单例)
NSFileManager *file = [NSFileManager defaultManager];
二,根据路径获取对应文件
//Library
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*path=[pathsobjectAtIndex:0];
//获取错误信息
NSError *error = nil; //NSError:
1,浅度便利,只获取当前目录下的文件,不会主动获取子文件下的文件
//参数1: 遍历路径 参数2: 获取错误信息
NSArray *array = [file contentsOfDirectoryAtPath: paths error:&error];
//遍历后,判断是否有错误,有则打印错误信息,没有则打印数组
if(error) {
NSLog(@"error = %@",error);
}else{
NSLog(@"array = %@",array);
}
控制台信息:array = (
Preferences,
Caches
)
2,深度便利,不仅获取当前目录下的文件,还会主动获取子文件下的文件
NSArray *array1 = [file subpathsOfDirectoryAtPath: path error:&error];
if(error){
NSLog(@"error=%@",error);
}else{
NSLog(@"array1 = %@",array1);
}
控制台打印: array1 = (
Preferences,
"Preferences/liuguilin.NSUserDefaults.plist",
Caches,
"Caches/Snapshots",
"Caches/Snapshots/liuguilin.NSUserDefaults",
"Caches/Snapshots/liuguilin.NSUserDefaults/[email protected]",
"Caches/Snapshots/liuguilin.NSUserDefaults/[email protected]"
)
三,创建文件
现在我想在Library目录下增加一个文件,该怎么操作呢?
//先获取到Library的目录路径
//Library
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*path=[pathsobjectAtIndex:0];
//然后拼接完整的路径
NSString *pathNew = [path stringByAppendingString:@"/NewHome.txt"];
//判断文件是否存在
BOOL bval = [file fileExistsAtPath:pathNew];
//如果返回值为YES,则文件存在,否则文件不存在,则创建
if(bval){
NSLog(@"文件已存在");
}else{
//参数1:文件路径 参数2:文件内容 nil 参数3:属性信息 nil
bval = [file createFileAtPath:pathNew contents:nil attributes:nil];
if(bval){ //返回值为YES,说明创建文件成功,否则失败
NSLog(@"创建文件成功");
}else{
NSLog(@"创建文件失败");
}
}
控制台信息:创建文件成功
让我们在此调用上面的浅便利方法,获取Library目录下的文件
控制台信息:array = (
Preferences,
"NewHome.txt",
Caches
)
指定目录下文件创建成功
当然,如果你将文件"/NewHome.txt"改为文件夹“NewHome”也是可以创建成功的。
但是,如果你将文件"/NewHome.txt"改为"/New/NewHome.txt",就会发现控制台打印的信息是:创建文件失败。
什么情况?原因就是上述方式是用来在当前已经存在的目录下创建一个新的文件或者文件夹,但如果最终文件的路径中存在尚未创建的目录,那他就无能为力了。也就是此时,你创建的不仅仅是一个文件,还有该文件路径中不存在的目录。
四,创建目录
//先获取到Library的目录路径
//Library
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*path=[pathsobjectAtIndex:0];
//然后拼接完整的路径
NSString *pathNew = [path stringByAppendingString:@"/New/New.txt"];
//判断文件是否存在
BOOL bval = [file fileExistsAtPath:pathNew];
//如果目录存在,则无须创建
if(bval) {
NSLog(@"目录已存在");
}else{
//参数1: 路径 参数2:是否需中间路径 YES 参数3: 属性 nil 参数4:错误提示
//中间路径:需创建几层路径
[file createDirectoryAtPath:pathNew withIntermediateDirectories:YES attributes:nil error:&error];
if(error){
NSLog(@"error=%@",error);
}else{
NSLog(@"目录创建成功");
}
}
}
控制台信息:目录创建成功
让我们在此调用上面的深便利方法,获取Library目录下的文件
控制台信息:array1 = (
Preferences,
"Preferences/liuguilin.NSUserDefaults.plist",
"NewHome.txt",
NewHome,
New,
"New/New.txt",
Caches,
"Caches/Snapshots",
"Caches/Snapshots/liuguilin.NSUserDefaults",
"Caches/Snapshots/liuguilin.NSUserDefaults/[email protected]",
"Caches/Snapshots/liuguilin.NSUserDefaults/[email protected]"
)
有没有发现,多了New和"New/New.txt",也就是此时会先创建路径中原本不存在的目录New,然后在该目录下创建我们需要的文件。
五,拷贝.移动和删除文件
//Library
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*path=[pathsobjectAtIndex:0];
NSString *pathNew = [path stringByAppendingString:@"/New/New.txt"];
1,拷贝文件/目录
NSArray*paths2=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*pathCopy=[paths2 objectAtIndex:0];
NSFileManager *file = [NSFileManager defaultManager];
NSError *error = nil;
//判断目标路径是否存在(注意:确保目标路径不存在)
BOOL bval = [file fileExistsAtPath: pathCopy];
if(bval){
NSLog(@"目标路径存在");
}else{
//参数1: 源路径 参数2:目标路径 参数3:错误信息
[file copyItemAtPath: pathNew toPath: pathCopy error:&error];
if(error){
NSLog(@"error = %@",error);
}else{
NSLog(@"拷贝成功");
}
}
控制台信息:目标路径存在
这里说一下拷贝,如果目标路径存在,那拷贝功能就变成覆盖原文件的内容,这个是不行的。
如果改成下面的路径:
NSString *pathCopy = [pathCopy stringByAppendingString:@"/Copy.txt"];
或者是:
NSString *pathCopy = [pathCopy stringByAppendingString:@"/Copy/Copy.txt"];
都会拷贝文件成功。
那如果是这样呢
NSString *pathNew = [path stringByAppendingString:@"/New"];
NSString *pathCopy = [pathCopy stringByAppendingString:@"/CopyFromNew/Copy"];
原路径New文件夹下存在文件New.txt,现在直接拷贝文件夹New到/CopyFromNew/Copy,但此时你会发现,目标路径下会创建/CopyFromNew/Copy路径,但Copy文件夹下并没有出现一份拷贝的New.txt。也就是不可以用拷贝文件夹的方式,将文件夹内的文件一起拷贝到目标文件。
2,移动文件/目录
NSArray*paths3=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*pathMove=[paths3 objectAtIndex:0];
if([file fileExistsAtPath:SRC_P]&&![file fileExistsAtPath:DST_P])
{
//参数1:源路径 参数2:目标路径 参数3:错误信息
[file moveItemAtPath: pathNew toPath: pathMove error:&error];
if(error){
NSLog(@"error = %@",error);
}else{
NSLog(@"移动成功");
}
}else{
NSLog(@"目标路径已存在,或源路径不存在");
}
控制台打印:目标路径已存在,或源路径不存在
我们来说下移动,如果目标文件存在,那移动过来相当于将文件覆盖,这是不行的。
如果改成:
NSString * pathMove = [pathMove stringByAppendingString:@"/Move"];
你会发现Move文件夹创建了,但文件夹内不存在文件。同时,New文件夹内的New.txt消失了。也就是文件确实被移出了原文件,但却没有出现在目标文件中。
如果改成:
NSString * pathMove = [pathMove stringByAppendingString:@"/Move2/Move2.txt"];
你会发现也报错了,说Move2文件夹未找到。什么意思,也就是此时不会帮你将未创建的目录自动创建并进行后续操作。目标路径中,除了最后一个文件外,其它的目录必须要存在。
如果改成:
NSString * pathMove = [pathMove stringByAppendingString:@"/Move.txt"];
终于移动成功了。
3,删除文件/目录
NSString *pathNew = [path stringByAppendingString:@"/New"];
if([file fileExistsAtPath: pathNew])
{
[file removeItemAtPath:REMOVE error:&error];
if(error){
NSLog(@"error=%@",error);
}else{
NSLog(@"删除成功");
}
}else{
NSLog(@"删除的文件或目录不存在");
}
有个点要说一下:如果这里删除一个文件夹,则其内部文件一起被删除。
Dome