目录管理(Create/Copy/Move/Remove/Attribute)
NSFileManager 照名称当然也是提供最基本目录管理:拷贝、移动、删除功能,以上这些与档案管理其实是类似的,目录管理增加了一项建立目录的功能,当然也会依照路径表示方式,使用2种方式介绍。
传统路径表示
传统路径所代表的就是一般路径表示,Mac是使用Unix的路径表示方式。
建立目录 Create
建立目录时,必需要注意withIntermediateDirectories
这个传入的值,当YES
,不管您指定的目录名称中间的目录是否存在,它都会自动不存在的目录并将所有目录建立完成,例如,当我要建立目录名称为dir1
,并且指定的路径是/tmp/dira/dir1
,中间的dira
目录并不存在,但指定withIntermediateDirectories: YES
就会先建立dira
再建立dir1
,反之只要建立目录过程碰到 路径本身不存在或您指定的目录已经存在 时就会停止建立并返回建立失败值为NO
。
//-----------start----------- NSFileManager *filemanager; filemanager = [NSFileManager defaultManager]; if ([filemanager createDirectoryAtPath: @"/tmp/dir1" withIntermediateDirectories: YES attributes: nil error: NULL] == YES) NSLog (@"建立成功!"); else NSLog (@"建立失败!"); //------------end------------
拷贝目录 Copy
//-----------start----------- NSFileManager *filemanager; filemanager = [NSFileManager defaultManager]; if ([filemanager copyItemAtPath: @"/tmp/dir1" toPath: @"/tmp/dir2" error: NULL] == YES) NSLog (@"拷贝成功!"); else NSLog (@"拷贝失败!"); //------------end------------
删除目录 Remove
//-----------start----------- NSFileManager *filemanager; filemanager = [NSFileManager defaultManager]; if ([filemanager removeItemAtPath:@"/tmp/dir2" error: NULL] == YES) NSLog (@"删除成功!"); else NSLog (@"删除失败"); //------------end------------
移动档案 Move
//-----------start----------- NSFileManager *filemanager; filemanager = [NSFileManager defaultManager]; if ([filemanager moveItemAtPath:@"/tmp/dir1" toPath: @"/tmp/dir2" error: NULL] == YES) NSLog (@"移动成功"); else NSLog (@"移动失败"); //------------end------------
网路路径表示
网路路径表示是将整个系统路径用网址的方式表示出来,例如:
/tmp/dir1
经过网路路径表示方式会变成:
file:///tmp/dir1
当然这是可以经过NSURL
将传统路径转换成网路路径:
//-----------start----------- [NSURL fileURLWithPath:@"/tmp/dir1"]; //------------end------------
建立目录 Create
建立目录时规则及参数用法先前已经有介绍,这里不再描述。
//-----------start----------- NSFileManager *filemanager; NSURL *oldDir = [NSURL fileURLWithPath:@"/tmp/dir1"]; NSURL *newDir= [NSURL fileURLWithPath:@"/tmp/dir2"]; filemanager = [NSFileManager defaultManager]; if ([filemanager createDirectoryAtURL: oldDir withIntermediateDirectories: YES attributes: nil error: NULL] == YES) NSLog (@"建立成功!"); else NSLog (@"建立失败!"); //------------end------------
拷贝目录 Copy
//-----------start----------- NSFileManager *filemanager; NSURL *oldDir = [NSURL fileURLWithPath:@"/tmp/dir1"]; NSURL *newDir= [NSURL fileURLWithPath:@"/tmp/dir2"]; filemanager = [NSFileManager defaultManager]; if ([filemanager copyItemAtURL: oldDir toURL: newDir error: NULL] == YES) NSLog (@"拷贝成功"); else NSLog (@"拷贝失败"); //------------end------------
删除目录 Remove
//-----------start----------- NSFileManager *filemanager; NSURL *oldDir = [NSURL fileURLWithPath:@"/tmp/dir1"]; NSURL *newDir= [NSURL fileURLWithPath:@"/tmp/dir2"]; filemanager = [NSFileManager defaultManager]; if ([filemanager removeItemAtURL:newDir error: NULL] == YES) NSLog (@"删除成功"); else NSLog (@"删除失败"); //------------end------------
移动目录 Move
//-----------start----------- NSFileManager *filemanager; NSURL *oldDir = [NSURL fileURLWithPath:@"/tmp/dir1"]; NSURL *newDir= [NSURL fileURLWithPath:@"/tmp/dir2"]; filemanager = [NSFileManager defaultManager]; if ([filemanager moveItemAtURL: oldDir toURL: newDir error: NULL] == YES) NSLog (@"移动成功"); else NSLog (@"移动失败"); //------------end------------
显示错误原因
不管做什么样的目录管理,如果返回值为NO
可能无法判断问题的原因,上面所提供的都未处理error
,下面例子会举一个方式将错误显示:
//-----------start----------- NSFileManager *filemanager; NSError *error; filemanager = [NSFileManager defaultManager]; if ([filemanager moveItemAtPath:@"/tmp/dir1" toPath: @"/tmp/dir2" error: &error] == YES) NSLog (@"移动成功"); else { NSLog (@"移动失败"); NSLog(@"%@",[error userInfo]); } //------------end------------
输出结果:
2014-02-22 08:28:03.052 test1[7372:303] 移动失败 2014-02-22 08:28:03.074 test1[7372:303] { NSDestinationFilePath = "/tmp/dir2"; NSFilePath = "/tmp/dir1"; NSSourceFilePathErrorKey = "/tmp/dir1"; NSUnderlyingError = "Error Domain=NSPOSIXErrorDomain Code=17 \"The operation couldn\U2019t be completed. File exists\""; NSUserStringVariant = ( Move ); }
从输出结果的NSUnderlyingError
看到原因是File exists
,也就是目录已经存在,无法完成,我们可以将程式改成:
//-----------start----------- NSFileManager *filemanager; NSError *error; filemanager = [NSFileManager defaultManager]; if ([filemanager moveItemAtPath:@"/tmp/dir1" toPath: @"/tmp/dir2" error: &error] == YES) NSLog (@"移动成功"); else { NSLog (@"移动失败"); NSLog(@"%@",[error localizedDescription] ); NSLog(@"%@",[error localizedFailureReason] ); NSLog(@"%@",[[[error userInfo] valueForKey:NSUnderlyingErrorKey] localizedDescription]); NSLog(@"%@",[[[error userInfo] valueForKey:NSUnderlyingErrorKey] localizedFailureReason]); } //------------end------------
错误的原因内容显示在程式列出四种方法,选择其中适合自已程式使用的方式。
NSLog(@"%@",[error localizedDescription] ); NSLog(@"%@",[error localizedFailureReason] ); NSLog(@"%@",[[[error userInfo] valueForKey:NSUnderlyingErrorKey] localizedDescription]); NSLog(@"%@",[[[error userInfo] valueForKey:NSUnderlyingErrorKey] localizedFailureReason]);
输出结果:
22014-02-22 08:46:42.557 test1[8025:303] 移动失败 2014-02-22 08:46:42.574 test1[8025:303] “dir1” couldn’t be moved to “tmp” because an item with the same name already exists. 2014-02-22 08:46:42.578 test1[8025:303] A file with the name “dir1” already exists. 2014-02-22 08:46:42.592 test1[8025:303] The operation couldn’t be completed. File exists 2014-02-22 08:46:42.604 test1[8025:303] File exists