ios优化复制大文件时,如何使内存运用最少且效率最高

我也是纠结了好几天,我想自己想个办法,但是数据复制不上去,我现在还不明白,如果有人知道我错在哪了,请留言,如果还有更好的方法,请分享共同进步。

________________________________________用输入流进行文件的复制

//这是我原图片的路径

NSString *Path=[NSHomeDirectory() stringByAppendingPathComponent:@"2238-110H514215143.jpg"];

NSError *error;

//这是我想要复制图片的路径

NSString *Path1=[NSHomeDirectory() stringByAppendingPathComponent:@"Movies/2238-110H514215143oooo.jpg"];

NSLog(@"%@",Path1);

//创建一个文件对象

NSFileManager *fileManager=[NSFileManager defaultManager];

//创建一个空的准备写入数据的文件

BOOL success=[fileManager createFileAtPath:Path1 contents:nil attributes:nil];

if (success) {

NSLog(@"复制文件成功");

}

//获取复制文件的属性全部

NSDictionary *dictionary=[fileManager attributesOfItemAtPath:Path error:&error];

//获取文件的大小

NSNumber *number=[dictionary objectForKey: NSFileSize];

long long a=[number longLongValue];

//为读和写作准备

NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:Path];

NSFileHandle *filehandle=[NSFileHandle fileHandleForWritingAtPath:Path1];

NSMutableData *data1;

//如何实现读取5000字节写入5000字节

//        for (long long l=0; l<=a; ) {

//        for (int i=0; i<=5000;i++) {

//        NSData *data2=[fileHandle readDataOfLength:l];     //这是我想的但是行不通不知是为什么

//        [data1 appendData:data2];

//            l++;

//        }

//         [filehandle writeData:data1];

//        }

while(a) {

NSData *data;

if (a<5000){

//如果文件小于5000字节是直接复制

data=[fileHandle readDataToEndOfFile];

[filehandle writeData:data];

}else{

//这是从头到尾读取5000字节

data=[fileHandle readDataOfLength:5000];

[filehandle writeData:data];

//a减是从头减5000字节正好是剩下的当a为0时正好是否

a-=5000;

}

}

[fileHandle closeFile];

[filehandle closeFile];

return 0;

}

}

时间: 2024-11-04 09:51:18

ios优化复制大文件时,如何使内存运用最少且效率最高的相关文章

iOS 创建静态库文件时去掉其中的Symbols

在工程中创建静态库文件时,默认会将一些Symbols加到静态库文件中,这样做有两个缺点: 1.如果引用静态库文件的工程中发生了bug,就会直接跳转到静态库的源码. 2.静态库文件的大小会因此翻几番.本人最近做的这个静态库文件中,去掉symbols前大小为7.8MB左右,去掉以后大小为2.8MB. 要去掉Symbols,首先打开Build Settings并选中静态库的Target,然后设置下列选项: 如果有错误或遗漏,欢迎批评指正. iOS 创建静态库文件时去掉其中的Symbols,布布扣,bu

【OC学习-25】实例:一次复制小文件和分次复制大文件——巩固文件的操作方法

(1)复制一个小文件,可以一次性把从源文件里读取出来的数据全都写入到目标文件中,这样就完成复制 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建一个源文件路径和目标文件路径 NSString *homePath=NSHomeDirectory(); NSString *oriFilePath=[homePath stringByAppending

php上传大文件时出现错误

在实现文件上传功能时,发现小文件可以上传(低于8M),但是上传大文件时,会出现以下错误: exception 'yii\web\BadRequestHttpException' with message 'Unable to verify your data submission.' in /var/www/html/labweb/vendor/yiisoft/yii2/web/Controller.php:110 Stack trace: #0 /var/www/html/labweb/ven

读取大文件时的优化经验

最近在编写一个关于图形学的东西时,由于需要读取模型,写了一个obj文件和mtl文件解析器.实际调试时,由于该文件较长,比如obj文件达到了20万行的量级,在解析时凸显出了各种性能问题,解决这些性能问题的同时,也总结出了一些经验,记录如下: 1 必须使用缓冲区.虽然操作系统实现读取文件应该是有缓冲区概念的,但是结果显示如果不使用缓冲区,而用fgetc挨个字符进行读取,速度会比使用缓冲区慢上1个数量级.因此,引出第一条经验:一切大文件读取必须使用缓冲区,减少fread或fgetc的次数. 2 关于m

优化 UltraEdit 打开大文件时的性能

UltraEdit 原本就是被设计成可以打开超大文件的工具,只不过在默认情况下需要进行以下优化设置: 禁止临时文件 禁止显示行号 禁止文件(回车 & 换行符)转换 禁止代码折叠 禁止显示函数列表 设置打开 XML 大文件阈值 禁止语法高亮 禁止列表变更指标(LCI) 1.禁止临时文件 打开 高级->配置->文件处理->临时文件.选择“不使用临时文件打开文件”.并设置阈值(当超过这个值时,不使用临时文件). 注意:这意味着如果你改动了文件的某些地方,这些改动将会立即生效. 2.禁止

比较java新旧I/O的性能——以复制大文件为例

package newio; import java.io.*; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; /* * 分别采用新旧I/O包的API复制文件,比较性能 */ public class CopyFileCompara { public void copyFileOld(File from,File to) throws IOException{ //使用传统的I/O流处理(加了缓冲机制) Fil

PHP加载大文件时require和file_get_contents的性能对比

在开发过程中发现,用require来加载一个很大(几百K,甚至几兆)的配置文件时,会造成响应超时.如果把这个配置文件的内容序列化后,用file_get_contents获取文件然后反序列化的方法来加载,就会快很多. 经过近两周的研究,大概知道了其中的原因. 首先,还从PHP的流程说起,PHP其实有两个流程,一个是启动的流程,一个是响应请求的流程.PHP作为Apache的一个模块,向Apache注册了两个函数,一个是Aapche启动的时候运行的函数:sapi_startup:一个是Apache接收

ElementTree 解析xml(minidom解析xml大文件时,MemoryError)

在使用minido解析xml文件时,因为文件过大,结果报错MemoryError.查询后得知是因为minidom在解析时是将所有文件放到内存里的,很占用内存,所以要考虑换一种方法来处理xml文件. ElementTree相比minidom消耗内存更小,下面是ElementTree的一些简单用法 XML源文件中的部分内容: #导入ElementTree from xml.etree import ElementTree #读入并解析XML文件,读入的是树形结构 doc = ET.parse(XML

Git Compare with base,比较大文件时,长时间等待,无法加载

问题 当使用Git比较一个大文件(几十兆数量级)版本见差异时,会一直等待加载,且内存消耗很大,导致其他进程很难执行.任务管理器中,可以看到此时的TortoiseGitMerge吃掉3G左右的内存. ? 原因 文件太大,加载很慢. ? 解决方法 其实,我们在使用[Compare with base]这个功能时,想要比较版本间文件的不同之处,因此,无需加载整个文件内容,只显示出文件中的不同内容即可.设置如下: 先使用[Compare with base]比较一个小文件,否则,肯能要等很长时间去加载一