在iOS目标-C中将文件从目录复制到目录

时间:2013-05-27 10:46:35

标签: ios objective-c performance copy nsthread

在我的应用中,我想从one directory to another directory复制文件。在源目录中有文件和文件夹。

我在下面的代码中执行此操作:

- (BOOL)copyDirectory:(NSString*)Directory toDirectory:(NSString*)targetDirectory
{
    NSLog(@"start copy");
    @try
    {
        NSError *error = nil;
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) objectAtIndex:0];
        NSString *folderPath = [path stringByAppendingPathComponent:targetDirectory];
        BOOL succes = [[NSFileManager defaultManager] fileExistsAtPath:folderPath];
        if(succes){
            return NO;
        }
        else
        {
            NSString *wwwPath = [[NSBundle mainBundle] pathForResource:Directory ofType:nil];
            NSArray *target= [[NSFileManager defaultManager] contentsOfDirectoryAtPath:wwwPath error:&error];

            [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:NO attributes:nil error:nil];
            int a = 0 ;
            for(a = 0 ; a < target.count;a++){
                NSString *temp = [target objectAtIndex:a];
                if([temp rangeOfString:@"."].location == NSNotFound)
                {
                    NSString *sourceDirectory = [NSString stringWithFormat:@"%@/%@",Directory,temp ];
                    NSString *DestanistionDirectory = [NSString stringWithFormat:@"%@/%@",targetDirectory,temp];

                    if([self copyDirectory:sourceDirectory toDirectory:DestanistionDirectory] == NO){
                        return NO;
                    }
                }
                else
                {
                    NSString *source = [NSString stringWithFormat:@"%@/%@",wwwPath,temp];
                    NSString *target = [NSString stringWithFormat:@"%@/%@",folderPath,temp];

                    BOOL result = [[NSFileManager defaultManager] copyItemAtPath:source toPath:target error:&error];
                    if(result)
                        currentFileCounter++;
                    [self performSelectorInBackground:@selector(updatePrograsBar) withObject:nil];
                    if(error != nil){
                        if(IsDEBUG) NSLog(@"error: %@",[error description]);
                        return NO;
                    }
                }
            }
        }
    }
    @catch (NSException *exception)
    {
        if(IsDEBUG)NSLog(@"%@",exception.description);
        return NO;
    }
    NSLog(@"end copy");
    return YES;
}

为了节省时间,我打电话给

- (BOOL)copyDirectory:(NSString*)Directory to Directory:(NSString*)target Directory 

在递归中我调用新线程。

- (BOOL)copyDirectory:(NSString*)Directory toDirectory:(NSString*)targetDirectory
{
    NSLog(@"start copy");
    @try
    {
        NSError *error = nil;
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) objectAtIndex:0];
        NSString *folderPath = [path stringByAppendingPathComponent:targetDirectory];
        BOOL succes = [[NSFileManager defaultManager] fileExistsAtPath:folderPath];
        if(succes){
            return NO;
        }
        else
        {
            NSString *wwwPath = [[NSBundle mainBundle] pathForResource:Directory ofType:nil];
            NSArray *target= [[NSFileManager defaultManager] contentsOfDirectoryAtPath:wwwPath error:&error];

            [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:NO attributes:nil error:nil];
            int a = 0 ;
            for(a = 0 ; a < target.count;a++){
                NSString *temp = [target objectAtIndex:a];
                if([temp rangeOfString:@"."].location == NSNotFound)
                {
                    NSString *sourceDirectory = [NSString stringWithFormat:@"%@/%@",Directory,temp ];
                    NSString *DestanistionDirectory = [NSString stringWithFormat:@"%@/%@",targetDirectory,temp];

                    dispatch_async(dispatch_get_global_queue(0, 0), ^{


                        [self copyDirectory:sourceDirectory toDirectory:DestanistionDirectory];

                    });                   
                }
                else
                {
                    NSString *source = [NSString stringWithFormat:@"%@/%@",wwwPath,temp];
                    NSString *target = [NSString stringWithFormat:@"%@/%@",folderPath,temp];

                    BOOL result = [[NSFileManager defaultManager] copyItemAtPath:source toPath:target error:&error];
                    if(result)
                        currentFileCounter++;
                    [self performSelectorInBackground:@selector(updatePrograsBar) withObject:nil];
                    if(error != nil){
                        if(IsDEBUG) NSLog(@"error: %@",[error description]);
                        return NO;
                    }
                }
            }
        }
    }
    @catch (NSException *exception)
    {
        if(IsDEBUG)NSLog(@"%@",exception.description);
        return NO;
    }
    NSLog(@"end copy");
    return YES;
}

但我需要知道何时完成复制所有文件和文件夹而不是从主要调用返回

-(BOOL)copyDirectory:(NSString*)Directory to Directory:(NSString*)target Directory

直到完成所有。

0 个答案:

没有答案