KVO实现自定义文件复制进度展示

一、创建文件

  说明:自定义文件类,通过NSFileManager 以及NSFileHandle 实现文件的创建和copy,为了控制内存的并发使用,通过控制每次赋值的固定长度来分多次复制:

NSString * path=NSHomeDirectory();
    path =[path stringByAppendingPathComponent:@"deskTop/Boby.m"];

    NSString * target=NSHomeDirectory();
    target =[target stringByAppendingPathComponent:@"deskTop/target.m"];

    NSFileManager * manager=[NSFileManager defaultManager];

    //校验并且创建文件
    if(![manager fileExistsAtPath:path]){
        [manager createFileAtPath:path contents:nil attributes:nil];
    }

    if(![manager fileExistsAtPath:target]){
        [manager createFileAtPath:target contents:nil attributes:nil];
    }
    NSDictionary * dic=[manager attributesOfItemAtPath:path error:nil];

    NSFileHandle * handle=[NSFileHandle fileHandleForReadingAtPath:path];
    NSFileHandle * handletTarget=[NSFileHandle fileHandleForWritingAtPath:target];

    int total=(int)[dic[@"NSFileSize"] integerValue];
    self.totalSize=total;
    int per=50;
    int count=total%per==0?total/per:total/per+1;
    for(int i=0;i<count;i++){

        [handle seekToFileOffset:self.nowSize];
        NSData *data= [handle readDataOfLength:per];

        int tem=per*(i+1);
        if(tem>total){
            tem=total;
        }

        self.nowSize=tem;

        [handletTarget seekToEndOfFile];
        [handletTarget writeData:data];
        [NSThread sleepForTimeInterval:0.2];

    }

    [handle closeFile];
[handletTarget closeFile];
二、设置观察者

  说明:自定义使用者,通过设置观察者来动态观察当前文件copy的进度并展示到控制台或者输出到UI,并提供方法接口,启动文件拷贝。

- (id) initWithFile:(FileMake *)files{
    self=[super init];

    if(self){
        self.file= files;
        [self.file addObserver:self forKeyPath:@"nowSize" options:NSKeyValueObservingOptionNew context:nil];
    }
    return self;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    CGFloat all=self.file.totalSize;
    CGFloat now=[[change objectForKey:@"new"] floatValue];
    CGFloat result=now/all;
    NSLog(@"%.2f",result);
    //一定不能忘了销毁当前的观察者
    if(result==1){
        [self.file removeObserver:self forKeyPath:@"nowSize"];
    }
}

- (void) begin{
    [self.file startCopy];
}

时间: 2024-10-10 00:45:30

KVO实现自定义文件复制进度展示的相关文章

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

JAVA之旅(二十五)--文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine 我们继续IO上个篇幅讲 一.文本复制 读写都说了,我们来看下其他的操作,我们首先来看复制 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中 实现的步骤: 1.在D盘创建一个文件,用于存储文件中的数据 2.定义读取流和文件关联 3.通过不断的读写完成数据的存储 关闭资源 package com.lgl.hel

java使用字节流和字符流实现文件复制

大家在Java开发中都会遇到文件复制的文件,众所周知,需要通过文件输入输出流实现. 那究竟该怎么做那,话不多说,直接上代码: 一,使用字节流复制文件 public class FileByteCopy {public static void main(String[] args) { FileByteCopy f= new FileByteCopy(); try { f.copy("d:/File/1.txt","d:/CopyFile/1.txt"); } cat

c#根据文件大小显示文件复制进度条实例

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.IO

低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

       一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android

Android 自定义对话框,进度条,下拉刷新等

这个demo集合了自定义对话框,进度条,下拉刷新以及popup弹出框等.是学习了网上开源项目后,抽取集合了常用对话框,进度条,下拉刷新以及popup弹出框等.现在结构目录简单,更易于学习和扩展使用.注释都卸载代码.下面进行简单的介绍以及部分代码展示. 本文demo下载:点击 1.整体实现的效果图 2.项目结构图 这上面项目结构图也是一目了然,有什么功能展示.大家也看到了,这上面类有点多,如果全部贴出来,不大可能,有兴趣下载本文源码. 3.看看基础类BaseActivity 我就贴一下基础类,还有

计算文件夹大小、拷贝文件显示进度

计算文件夹大小(get-childitem -path $folder -recurse| measure-object -property length -sum).sum/1mb #拷贝文件提示进度(脚本只对零散文件有效,如果有大型文件的话,进度显示不正确)$folder = "D:\Temp_del"$des = "d:\test"$p=0$sizes = (get-childitem -path $folder -recurse| measure-objec

Android简易实战教程--第十七话《自定义彩色环形进度条》

转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52203533   点击打开链接 在Android初级教程里面,介绍了shape用法的理论知识,再来完成这个小案例将会变得非常简单哦.(欢迎学习阅读):http://blog.csdn.net/qq_32059827/article/details/52203347 点击打开链接 这一篇就针对这个知识点,完成一个自定义的彩色进度条.系统自带的环形进度条是黑白相间的,如果你不是色盲,

Linux scp文件复制

scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 1.scp命令的用处: scp在网络上不同的主机之间复制文件,它使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而安全的远程拷贝文件. 2.scp命令基本格式: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S pro

oc 文件管理NSFileManager,文件读写NSFileHandle ,设计一个文件管理类将一个文件复制到另一个文件,由于文件过大要求每次复制100长度,通过NSFileHandle 来操作,并

设计一个文件管理类将一个文件复制到另一个文件,由于文件过大要求每次复制100长度,通过NSFileHandle来操作,并通过代理模式打印出当前的赋值进度百分比 main.m #import <Foundation/Foundation.h> #import "FileMaker.h" int main(int argc,const char * argv[]) { @autoreleasepool { NSString * fromPath = [NSHomeDirecto