使用 NSFileManager 在复制文件期间更新进度条

Posted

技术标签:

【中文标题】使用 NSFileManager 在复制文件期间更新进度条【英文标题】:update progress bar during copy file with NSFileManager 【发布时间】:2013-07-06 19:39:07 【问题描述】:

我复制文件然后我的应用程序完成从资源启动到缓存目录。 但我想在复制文件的过程中更新我的进度条。

我用下面的代码复制文件:

-(BOOL)copyDirectory:(NSString*)source toDirectory:(NSString*)targat

    BOOL retVal = YES;
    NSFileManager *fileManager = [[NSFileManager alloc] init];

    NSError *error;
    if ([fileManager fileExistsAtPath:targat] == YES)
    
        NSError *error = nil;
        [fileManager removeItemAtPath:targat error:&error];
    


    if(![fileManager copyItemAtPath:source
                             toPath:targat
                              error:&error])
    
        NSLog(@"Error copy files: %@", [error description]);
        retVal = NO;
    
    [fileManager release];

    return retVal;

想不出好主意,如何根据复制文件的进度更新进度条。

【问题讨论】:

【参考方案1】:

在高层次上,你可以接近以下:

    在单独的线程中运行复制过程 (P1) 运行另一个线程 (P2),它会定期(比如每 100 毫秒)读取目标文件 current_size。 计算current_size / total_size 更新进度条 UI 元素

然后您只想找出文件的大小,实际上不必打开它。只需像这样使用NSFileManager

NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:self.finalPath error:NULL];
unsigned long long fileSize = [attributes fileSize]; // in bytes

【讨论】:

您是否有示例代码演示如何在一个单独的线程中复制,该线程会告诉您何时完成复制

以上是关于使用 NSFileManager 在复制文件期间更新进度条的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager:复制文件不成功

NSFileManager 是不是将修改日期等元数据与文件一起复制?

NSFileManager 线程安全

NSFileManager:如果存在重复文件

NSFileManager UUID 应用目录

解决[[NSFileManager defaultManager] contentsOfDirectoryAtPath 方法获取不到数据的bug