iOS文件操作基础_Morris_的博客-程序员宅基地

技术标签: NSData  文件操作  NSFilehandle  # App开发  

NSFileHandle

方法 描述
+(NSFileHandle *)fileHandleForReadingAtPath:path 打开文件以便读取
+(NSFileHandle *)fileHandleForWritingAtPath:path 打开文件以便写入
+(NSFileHandle *)fileHandleForUpdatingAtPath:path 打开文件以便读写
-(NSData *)availableData 返回文件有效字符长度(bytes),有个问题是,如果在超大文件中用该方法,内存会暴涨直到卡死,该方法会将文件读入内存,然后计算长度,此时文件句柄指向文件结尾。
-(NSData *)readDataToEndOfFile 读取文件末尾处之前的数据
-(NSData *)readDataOfLength:(NSUInteger)bytes 读取指定长度的字节.这里也有个问题:当你存储汉字的时候,如果读取的字节数正好把一个汉字分多次读取,NSData中是有数据的.但是不能用NSString打印出来,此时打印出来为null.
-(void)writeData:data 将数据data写入文件
-(unsigned long long)offsetInFile 获取当前文件中的操作位置
-(void)seekToFileOffset:offset 将当前文件的操作位置设定为offset
-(unsigned long long)seekToEndOfFile 返回整个文件大小,并将读写指针移到文件尾部.该方法和上面的一个方法都是在磁盘上操作的,并没有将文件读到内存
-(void)truncateFileAtOffset:offset 将文件的长度设定为offset
-(void)closeFile 关闭文件

读取文件

//读取对应路径下的文件大小

+ (unsigned long long)getSizeWithFilePath:(nonnull NSString *)filePath error:(NSError **)error
{
    NSFileManager *fm = [NSFileManager defaultManager];
    NSDictionary *attributes = [fm attributesOfItemAtPath:filePath error:error];
    return attributes.fileSize;
}

    /**
     NSFileHandle *fileHande = [NSFileHandle fileHandleForReadingAtPath:filePath];
     return [fileHande seekToEndOfFile];
     */

//读取对应路径下的文件

+ (NSData *)fileData:(NSString *)filePath {
    /**
     NSError *readError;
     NSFileHandle *fileHande = [NSFileHandle fileHandleForReadingFromURL:[NSURL URLWithString:filePath] error:&readError];
     if (!readError) {
     NSData *readData = [fileHande readDataToEndOfFile];
     [fileHande closeFile];
     return readData;
     }
     //也闪退
     NSFileHandle *fileHande = [NSFileHandle fileHandleForReadingAtPath:filePath];
     return [fileHande readDataToEndOfFile];
     */
    
    NSFileHandle *fileHande = [NSFileHandle fileHandleForReadingAtPath:filePath];
    return [fileHande availableData];
}

注意:以上读取文件的方式只适用于小文件读取,小于5M或者再大点,如果是大文件的读取,app内存会暴涨,绝壁会闪退。具体原因见 iOS读取文件闪退

操作文件

文件分片

uint64_t offset = uplodFile.totalBytes / chuckCount;//每个分片大小 = 总大小 / 分片数量
for (int i = 1; i <= chuckCount; i++) {
	//打开文件
    NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    //seek文件
    [readHandle seekToFileOffset:offset * (i -1)];
    //读取每个分片中的文件
    NSData* data = [readHandle readDataOfLength:offset];
}

获取文件类型后缀

[NSString stringWithFormat:@".%@",[filePath pathExtension]];

获取文件的MINIType

- (NSString *)getMIMETypeWithCAPIAtFilePath:(NSString *)path
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        return nil;
    }
    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
    CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
    CFRelease(UTI);
    if (!MIMEType) {
        return @"application/octet-stream";//任意的二进制文件
    }
    return (__bridge NSString *)(MIMEType);
}

获取文件大小

+ (unsigned long long)getSizeWithFilePath:(nonnull NSString *)filePath error:(NSError **)error
{
    /**
     NSFileHandle *fileHande = [NSFileHandle fileHandleForReadingAtPath:filePath];
     return [fileHande seekToEndOfFile];
     */
    NSFileManager *fm = [NSFileManager defaultManager];
    NSDictionary *attributes = [fm attributesOfItemAtPath:filePath error:error];
    return attributes.fileSize;
}

//计算文件的大小,单位为 M,这种计算大文件绝壁闪退

- (CGFloat)fileSize:(NSURL *)url {
    return [[NSData dataWithContentsOfURL:url] length] / 1024.00 / 1024.00;
}

文件另存和删除

int32_t const VH_CHUNK_SIZE = 8 * 1024;

//另存为
- (NSString *)writefile:(NSString *)filePath
{
    //写入文件路径
    NSString *toPath = [NSString stringWithFormat:@"%@/%@",NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject,[filePath lastPathComponent]];
    //如果存在,先删除
    if ([[NSFileManager defaultManager] fileExistsAtPath:toPath]) {
        [[NSFileManager defaultManager] removeItemAtPath:toPath error:nil];
    }
    //创建文件路径
    if (![[NSFileManager defaultManager] createFileAtPath:toPath contents:nil attributes:nil]) {
        return nil;
    }
    //打开文件
    NSFileHandle *sourceHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
    NSFileHandle *writeHandle = [NSFileHandle fileHandleForWritingAtPath:toPath];
    if(sourceHandle == nil || writeHandle == nil) {
        return nil;
    }
    //读取文件写入
    BOOL done = NO;
    while(!done) {
        @autoreleasepool{
            NSData *data = [sourceHandle readDataOfLength:VH_CHUNK_SIZE];
            if([data length] == 0) {
                done = YES;
            }
            [writeHandle seekToEndOfFile];
            [writeHandle writeData:data];
            data = nil;
        }
    }
    //关闭文件
    [sourceHandle closeFile];
    [writeHandle closeFile];
    return toPath;
}
//删除本地上传的文件
- (BOOL)deletefile:(NSString *)uploadPath {
    if ([[NSFileManager defaultManager] fileExistsAtPath:uploadPath]) {
        BOOL removed = [[NSFileManager defaultManager] removeItemAtPath:uploadPath error:nil];
        OSSLogDebug(@"removed file %@ %@",uploadPath,[email protected]"sucess":@"failed");
        return removed;
    }
    return NO;
}

未完待续…

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Morris_/article/details/102912077

智能推荐

rd /q /s 删除文件_laj12347的博客-程序员宅基地

DOS 命令rd也有写法rmdir,源自ReMakeDirectory。使用的方法也很简单:rd 文件夹名 即可,例如:rd abc。它支持带路径的文件夹名,例如:rd d:\abc。 有时候,rd并不能很好地完成任务:你让它删除abc文件夹,它却告诉你:目录不是空的。不过,这也不能怨它偷懒不干活,只是它的脾气有点怪:如果要删除的文件夹下面还有子文件,你得给rd戴顶高帽,加个 /s 参数,...

wow.min.js使用方法汇总_lijiong521的博客-程序员宅基地

Wow.js 允许用户滚动页面的时候展示 CSS 动画。默认的,用户可以使用它来出发 animate.css 动画。但是用户也可以非常容易修改设置喜欢的动画库。WOW.js 需要 animate.css 配合,所以它支持 animate.css 多达 60 多种的动画效果,能满足您的各种需求。wow.min.js可以实现在滚动下的动画状态。使用方法:1、加入animate.css&...

Python爬虫(一):环境配置__天高云淡的博客-程序员宅基地_爬虫环境安装

Python爬虫(一):环境配置由于项目需要,最近开始学习和使用Python写web爬虫。要理解网络爬虫最好的例子就是使用最多的搜索引擎,网络爬虫是搜索引擎最重要的一部分。搜索引擎根据用户的输入关键字,使用一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列中并最终呈现给用户。实际项目中,我们往往不需要爬取所有网站的源码,而只是对感兴趣的某个或某几个网站做定向爬取,爬

30分钟掌握ES6/ES2015核心内容_会飞的胖达喵的博客-程序员宅基地

转载地址:http://www.jianshu.com/p/ebfeb687eb70ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015。虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已

篇三|ClickHouse的数据类型_大数据技术与数仓的博客-程序员宅基地_clickhouse decimal

ClickHouse提供了许多数据类型,它们可以划分为基础类型、复合类型和特殊类型。我们可以在system.data_type_families表中检查数据类型名称以及是否区分大小写。SELECT * FROM system.data_type_families上面的系统表,存储了ClickHouse所支持的数据类型,注意不同版本的ClickHouse可能数据类型会有所不同,具体如下表所示:┌─name────────────────────┬─case_insensitive─┬─alias_to

Spring boot 上传文件到腾讯云储存_闻品高的博客-程序员宅基地

1.登录到腾讯云平台(https://cloud.tencent.com)2.3.新建4.查看刚刚创建存5.选择6.创建Spring boot项目&amp;lt;!--腾讯云存储依赖--&amp;gt;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.qcloud&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;cos_api&amp;lt;/artifac...

随便推点

ubuntu16.04安装opencv3.4.1_弯道超越的博客-程序员宅基地

安装Eigen3sudo apt-get install libeigen3-dev#拷贝sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include参考:https://www.cnblogs.com/newneul/p/8256803.html安装依赖项sudo apt-get install build-essent...

关于新技术和新语言的学习_阿飞冲冲冲的博客-程序员宅基地

关于新技术和新语言的学习1.了解会上手就行,知道流程,不必要深入研究2.学习一门语言最佳的途径是通过工作3.程序员的时间很宝贵,不能用在不断尝试新东西上,而要用在提升深度上面。4.目前 php  ruby python coffeescript 都能上手了,就不要去深入搞了。等php ruby python 的性能提上了再去搞。5.不学习性能低下的解决方案,GO erlan

使用gateway报错 java.lang.NullPointerException: null_laimao8079的博客-程序员宅基地

服务单独访问没有问题,使用gateway访问报错java.lang.NullPointerException: null at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) ~[na:1.8.0_171] at java.util.concurrent.ConcurrentHashMa...

概率密度函数估计_DeeGLMath的博客-程序员宅基地

概率密度函数估计前导知识:1. 最大似然估计导包:import numpy as npfrom numpy.linalg import choleskyimport matplotlib.pyplot as pltimport random # 用于随机抽样设置随机样本数:# 设置随机样本数sampleNo = 40;一维数据处理:mu = np.array([[1]])Sigma = np.array([[2]])R = cho...

mybatis-plus QueryWrapper LambdaQueryWrapper_中国lanwp的博客-程序员宅基地

ContractTemplate::getTemplateCode 转为对应的字段LambdaQueryWrapper&lt;SomeClass&gt; objectLambdaQueryWrapper = Wrappers.lambdaQuery(); objectLambdaQueryWrapper.eq(searchDto.getTemplateCode() != null...

python逐行获取_python文件逐行读取四种方法_weixin_39806065的博客-程序员宅基地

原博文2018-09-01 13:42 −下面是四种Python逐行读取文件内容的方法, 并分析了各种方法的优缺点及应用场景,以下代码在python3中测试通过, python2中运行部分代码已注释,稍加修改即可。 方法一:readline函数 1 2 3 4 5 6 7 8 #-*- coding: U...相关推荐2019-09-28 21:13 −Python python是...

推荐文章

热门文章

相关标签