NSFileHandle拷贝大文件+多线程

//1、要分次读取,分次写入
//2、最后要刷新缓冲区
    
     NSString *docpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
     NSString *sourceFile = [docpath stringByAppendingPathComponent:@"Xcode_6.4.dmg"];
     NSString *destFile =[docpath stringByAppendingPathComponent:@"Xcode_6.4.dmg.copy"];
    //获得全局队列dispatch_get_global_queue
    //1、优先级
    //2、保留字段 默认为0
    
    __weak ViewController* weakSelf = self;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
        
        NSFileHandle *srcFdh = [NSFileHandle fileHandleForReadingAtPath:sourceFile];
        //创建文件
        [[NSFileManager defaultManager] createFileAtPath:destFile contents:nil attributes:nil];
        
        NSFileHandle *destFdh = [NSFileHandle fileHandleForWritingAtPath:destFile];
            
            long long filesize = [srcFdh seekToEndOfFile];
            //还得复位到头指针
            [srcFdh seekToFileOffset:0];
            
            NSLog(@"文件的总长度:%llu",filesize);
            
            dispatch_sync(dispatch_get_main_queue(), ^
            {
                [weakSelf.progressbar setHidden:NO];
            });
            
            NSLog(@"currentThread:%@",[NSThread currentThread]);

 //注意:在子线程中需要重新开启自动释放池,否则会造成内存泄露
            //一般在方法返回对象时会产生 return  [obj autorelease];
            //而autorelease 需要借助外部的自动释放工具NSAutoReleasePool  drain 方法来释放所有标识过autorealse的对象
            //如果对象要纳入autoreleasepool 自动释放,需要将对象的申请(产生)和释放都放在autorelease作用域中
                NSData *buffer =nil;

                while (YES)
                {
                    @autoreleasepool
                    {
                        //对象获取要放在自动释放池内。
                        buffer = [srcFdh readDataOfLength:4096*2];
                        if (buffer.length == 0)
                        {
                            break;
                        }
                        //写入数据
                        [destFdh writeData:buffer];
                        buffer = nil;//提前告知ARC,请给我加一个release方法
                    }
                    //计算进度
                    //注意:一定要将整形转换为Float再进行计算
                    float progress = ((float)destFdh.offsetInFile/filesize) ;
                    //如果要减少进度的更新,可以将进度值放大一点
                    NSInteger i = (NSInteger)(progress *1000) %10 ;
                    if (i==0)
                    {
                        //NSLog(@"进度更新..%f",progress);
                        dispatch_async(dispatch_get_main_queue(), ^
                        {
                            [weakSelf.progressbar setProgress:progress];
                        });
                    }
                    //能减少CPU的占用
                   // [NSThread sleepForTimeInterval:0.0001];
                }
                        //刷新缓冲
            [destFdh synchronizeFile];
            
            NSLog(@"拷贝文件成功!");
        }
        [srcFdh closeFile];
        [destFdh closeFile];
});


软件名称: Nullsoft Copy 版本:0.1 原版下载:不需要 运行环境:Windows 95, 98, 98: SE, ME, NT 4.0, 2000, and XP 软件性质:免费 官方主页:http://www.nullsoft.com 汉化补丁: NSCopy.exe 汉化补丁大小: 64.0 kB 汉化作者:余飞雨 软件介绍: 你还在用 Windows 的“复制”“粘贴”命令吗?我晕,这都什么年代了,拷贝一部电影你要用多长时间?更可怕的是,拷贝几十部电影呢?没关系,慢慢坐着等吧,先玩其他的东东,糟糕,死机了!强行关闭程序,拷贝到 99% 的文件突然丢失了。唉...这个 “瘟都死”,害人不浅哪!你长叹了一口气,有没有更好的办法呢?有,当然有了,支持文件拷贝断点续传的软件目前倒有几个。先推荐一款,Total Copy,这是我下载后从此就不会再删除的软件,拷贝速度飞快,支持断点续传,即使 Windows 突然死机,开机后它还会照样拷贝文件一点都不会丢失,拷贝速度和你的硬件配置以及内存大小有关系,如果你的配置足够好,拷贝速度可以选择“无限制”,否则还是限制速度为妙,弄得不好也会造成死机,虽然文件不会损坏,但死机恐怕是谁都不愿见到的吧?使用这个软件的方法先说一下:在要拷贝文件上面点右键,拖动文件到要拷贝文件夹,弹出快捷菜单,然后选择“Total Copy Here”(全部拷贝到这里)或“Total Move Here”(全部移动到这里),文件就开始拷贝了。还有一款是 Copy Handler,功能和 Total Copy 差不多,不过感觉没有 Total Copy 好用。另外一款是非官方的 Total Copy 1.2 XP,稳定性较差,用过之后我就不敢用了。接下来出场的就是 Nullsoft Copy 了,这可是大名鼎鼎的 Nullsoft(Winamp 的东家) 的东西哦。它和以上工具不同的地方就在于它是一个目录对拷工具,如果你有许多文件拷贝的话,请先把它们放到一个目录里,然后选择你要拷贝的目标目录,然后选择“是否覆盖现有文件”或“是否出现错误提示”,再选择一下你拷贝的“最大速度”(软件默认速度是 10240 字符/秒,如果电脑配置不高的话,建议不要使用“无限制”,以免当机),按“开始”就可以拷贝了。文件太多怎么办?没关系,先到一边喝点咖啡再说。咖啡喝完了,再一看,呵呵,文件拷贝完了。这个软件同样支持断点续传,拷贝速度我就不多说了,自己下载后体验体验。更为可贵的是,它还支持把任务保存为“设置文件”,以后拷贝只要点“载入”按钮,选择设置文件就OK了。这么好的软件有多大?64 k,那些动辄几十兆几百兆的软件是不是应该反省一下了?我顶...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值