目录管理(Create/Copy/Move/Remove/Attribute)

目录管理(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