在iOS Objective-C中将文件从一个目录复制到另一个目录

在iOS Objective-C中将文件从一个目录复制到另一个目录,ios,objective-c,performance,copy,nsthread,Ios,Objective C,Performance,Copy,Nsthread,在我的应用程序中,我想将文件从一个目录复制到另一个目录。在源目录中有文件和文件夹 我在下面的代码中执行此操作: - (BOOL)copyDirectory:(NSString*)Directory toDirectory:(NSString*)targetDirectory { NSLog(@"start copy"); @try { NSError *error = nil; NSString *path = [NSSearchPathF

在我的应用程序中,我想将文件从
一个目录复制到另一个目录
。在源目录中有文件和文件夹

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

- (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 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;
}

直到完成所有操作。

您的代码有几个问题,但首先要做的是-为什么不直接使用
-[NSFileManager copyItemAtPath:toPath:error:
来复制文件夹?监视数据大小并将其与原始包进行比较。复制文件时,我需要更新程序栏@马鲁克斯
- (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