当前位置: 首页 > 编程日记 > 正文

IOS数据存储之文件沙盒存储

前言:

之前学习了数据存储的NSUserDefaults,归档和解档,对于项目开发中如果要存储一些文件,比如图片,音频,视频等文件的时候就需要用到文件存储了。文件沙盒存储主要存储非机密数据,大的数据。

接下来具体认识一下沙盒存储:

每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒。在ios8中已经开放访问。

应用沙盒一般包括以下几个文件目录:应用程序包、Documents、Libaray(下面有Caches和Preferences目录)、tmp。

应用程序包:包含所有的资源文件和可执行文件。

Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也有可能会清除该目录下的文件,iTunes不会同步该目录。iphone重启时,该目录下的文件会丢失。

Library:存储程序的默认设置和其他状态信息,iTunes会自动备份该目录。

Libaray/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除。一般存放体积比较大,不是特别重要的资源。

Libaray/Preferences:保存应用的所有偏好设置,ios的Settings(设置)应用会在该目录中查找应用的设置信息,iTunes会自动备份该目录。

具体获取各个目录代码如下:

复制代码
    // 获得应用程序沙盒的Documents文件夹路径NSArray *arrDocumentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString *documentPath=[arrDocumentPaths objectAtIndex:0];NSLog(@"Documents path: %@",documentPath);// 获得应用程序沙盒的Caches文件夹路径NSArray *arrCachesPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);NSString *CachesPath=[arrCachesPaths objectAtIndex:0];NSLog(@"Caches path: %@",CachesPath);// 获得应用程序沙盒的Downloads文件夹路径NSArray *arrDownloadPaths=NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory,NSUserDomainMask,YES);NSString *loadPathsPath=[arrDownloadPaths objectAtIndex:0];NSLog(@"Downloads path: %@",loadPathsPath);// 获得应用程序沙盒的home文件夹路径NSString *homePath= NSHomeDirectory();// 获得应用程序沙盒的tmp文件夹路径NSString *TmpPath= NSTemporaryDirectory();
复制代码

为了方便使用整理一个File工具类:

FileUtils.h

复制代码
#import <Foundation/Foundation.h>@interface FileUtils : NSObject//返回缓存根目录 "caches"
+(NSString *)getCachesDirectory;//返回根目录路径 "document"
+ (NSString *)getDocumentPath;//创建文件夹
+(BOOL)creatDir:(NSString*)dirPath;//删除文件夹
+(BOOL)deleteDir:(NSString*)dirPath;//移动文件夹
+(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath;//创建文件
+ (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data;//读取文件
+(NSData*)readFile:(NSString *)filePath;//删除文件
+(BOOL)deleteFile:(NSString *)filePath;//返回 文件全路径
+ (NSString*)getFilePath:(NSString*) fileName;//在对应文件保存数据
+ (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data;//从对应的文件读取数据
+ (NSData*)readDataFromFile:(NSString*)fileName;@end
复制代码

FileUtils.m

复制代码
#import "FileUtils.h"@implementation FileUtils//返回缓存根目录 "caches"
+(NSString *)getCachesDirectory
{NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);NSString *caches = [paths firstObject];return caches;
}//返回根目录路径 "document"
+ (NSString *)getDocumentPath
{NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentPath = [paths firstObject];return documentPath;
}//创建文件目录
+(BOOL)creatDir:(NSString*)dirPath
{if ([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//判断dirPath路径文件夹是否已存在,此处dirPath为需要新建的文件夹的绝对路径{return NO;}else{[[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];//创建文件夹return YES;}}//删除文件目录
+(BOOL)deleteDir:(NSString*)dirPath
{if([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//如果存在临时文件的配置文件{NSError *error=nil;return [[NSFileManager defaultManager]  removeItemAtPath:dirPath error:&error];}  return  NO;
}//移动文件夹
+(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath;
{NSError *error=nil;if([[NSFileManager defaultManager] moveItemAtPath:srcPath toPath:desPath error:&error]!=YES)// prePath 为原路径、     cenPath 为目标路径{NSLog(@"移动文件失败");return NO;}else{NSLog(@"移动文件成功");return YES;}
}//创建文件
+ (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data
{return  [[NSFileManager defaultManager] createFileAtPath:filePath contents:data attributes:nil];
}//读取文件
+(NSData*)readFile:(NSString *)filePath
{return [NSData dataWithContentsOfFile:filePath options:0 error:NULL];
}//删除文件
+(BOOL)deleteFile:(NSString *)filePath
{return [self deleteDir:filePath];}+ (NSString *)getFilePath:(NSString *)fileName
{NSString *dirPath = [[self getDocumentPath] stringByAppendingPathComponent:fileName];return dirPath;
}+ (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data
{NSString *filePath=[self getFilePath:fileName];return [self creatFile:filePath withData:data];
}+ (NSData*)readDataFromFile:(NSString*)fileName
{NSString *filePath=[self getFilePath:fileName];return [self readFile:filePath];
}@end

相关文章:

剖析Focal Loss损失函数: 消除类别不平衡+挖掘难分样本 | CSDN博文精选

作者 | 图像所浩南哥来源 | CSDN博客论文名称&#xff1a;《 Focal Loss for Dense Object Detection 》论文下载&#xff1a;https://arxiv.org/pdf/1708.02002.pdf论文代码&#xff1a;https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines…

windows下mysql开启慢查询

mysql在windows系统中的配置文件一般是my.ini,我的路径是c:\mysql\my.ini,你根据自己安装mysql路径去查找[mysqld]#The TCP/IP Port the MySQL Server will listen onport3306#开启慢查询log-slow-queries E:\Program Files\MySQL\MySQL Server 5.5\mysql_slow_query.loglong_…

FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(新接口)

在https://blog.csdn.net/fengbingchun/article/details/93975325 中给出了通过旧接口即FFmpeg中已废弃的接口实现通过摄像头获取视频流然后解码并显示的测试代码&#xff0c;这里通过使用FFmpeg中的新接口再次实现通过的功能&#xff0c;主要涉及到的接口函数包括&#xff1a;…

iOS经典讲解之获取沙盒文件路径写入和读取简单对象

#import "RootViewController.h" interface RootViewController () end 实现文件&#xff1a; implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; [self path]; [self writeFile]; [self readingFi…

Google最新论文:Youtube视频推荐如何做多目标排序

作者 | 深度传送门来源 | 深度传送门&#xff08;ID:deep_deliver&#xff09;导读&#xff1a;本文是“深度推荐系统”专栏的第十五篇文章&#xff0c;这个系列将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变化。本文主要介绍下Google在RecSys …

Jmeter 笔记

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库&#xff0c; FTP 服务器&#…

王贻芳院士:为什么中国要探究中微子实验?

演讲嘉宾 | 王贻芳&#xff08;中国科学院院士、中科院高能物理研究所所长&#xff09;整理 | 德状出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;日前&#xff0c;在2019腾讯科学WE大会期间&#xff0c;中国科学院院士、高能物理研究所所长王贻芳分享了中微子与光电…

一个苹果证书供多台电脑开发使用——导出p12文件

摘要 在苹果开发者网站申请的证书&#xff0c;是授权mac设备的开发或者发布的证书&#xff0c;这意味着一个设备对应一个证书&#xff0c;但是99美元账号只允许生成3个发布证书&#xff0c;两个开发证书&#xff0c;这满足不了多mac设备的使用&#xff0c;使用p12文件可以解决这…

FFmpeg中AVDictionary介绍

FFmpeg中的AVDictionary是一个结构体&#xff0c;简单的key/value存储&#xff0c;经常使用AVDictionary设置或读取内部参数&#xff0c;声明如下&#xff0c;具体实现在libavutil模块中的dict.c/h&#xff0c;提供此结构体是为了与libav兼容&#xff0c;但它实现效率低下&…

RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

问题现象RocketMQ3.2.2版本&#xff0c;测试时尝试发送消息时自动创建Topic&#xff0c;设置了队列数量为8&#xff1a;producer.setDefaultTopicQueueNums(8);同时设置broker服务器的配置文件broker.properties&#xff1a;defaultTopicQueueNums16但实际创建后从控制台及后台…

iOS各种宏定义

#ifndef MacroDefinition_h #define MacroDefinition_h //************************ 获取设备屏幕尺寸********************************************** //宽度 #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //高度 #define SCREENH_HEIGHT [UIScree…

开源库libuuid简介及使用

libuuid是一个开源的用于生成UUID(Universally Unique Identifier&#xff0c;通用唯一标识符)的库&#xff0c;它的源码可从https://sourceforge.net/projects/libuuid/ 下载&#xff0c;最新版本为1.0.3&#xff0c;更新于2013年4月27日&#xff0c;此库仅支持在类Linux下编译…

深度学习会议论文不好找?这个ConfTube网站全都有

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅 出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

Java用for循环Map

为什么80%的码农都做不了架构师&#xff1f;>>> 根据JDK5的新特性,用For循环Map,例如循环Map的Key for(String dataKey : paraMap.keySet()) { System.out.println(dataKey ); } 注意的是,paraMap 是怎么样定义的,如果是简单的Map paraMap new …

iOS 应用发布到AppStore流程

iOS开发者&#xff0c;把开发出来的App上传到App Store是必须的。下面就来详细介绍下具体流程。 方法/步骤 1打开苹果开发者中心 打开后点击&#xff1a;Member Center 2如果你的电脑没有保存密码&#xff0c;则会提示你输入开发者帐号和密码&#xff0c;因为我的电脑已经保存了…

FFmpeg中编码类型为rawvideo无须解码直接显示测试代码

在 https://blog.csdn.net/fengbingchun/article/details/93975325 中介绍过通过FFmpeg可以直接获取usb视频流并解码显示的测试代码&#xff0c;当时通过usb获取到的视频流编码类型为AV_CODEC_ID_RAWVIDEO&#xff0c;像素格式为AV_PIX_FMT_YUYV422&#xff0c;其实编码类型为r…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」蓄势待发,还不快上车?...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

融合应用11.1.8安装,一步一步的引导

融合应用11.1.8安装,一步一步的引导 融合应用11.1.8 安装并不是简单的与电子商务套件11 i / R12安装。 所以我们需要安装划分为许多步骤。 请注意,11.1.8 11.1.7总统发布供应是几乎相同的。 在同一时间的步骤和一些组件11.1.6和11.1.5相比有所不同。 这里我们有实际使用同一个…

FFmpeg中一个线程获取视频流一个线程执行scale测试代码

在https://blog.csdn.net/fengbingchun/article/details/94712986 中介绍过如果usb视频流编码类型为rawvideo则无需进行解码&#xff0c;可直接通过av_read_frame获取视频流然后再通过sws_scale进行像素格式转换&#xff0c;当在高分辨率情况下&#xff0c;有时达不到实时显示&…

医疗影像处理:去除医疗影像中背景的影响2D/3D【numpy-code】| CSDN博文精选

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | chestnut--来源 | CSDN博客在医疗影像中特别是CT影像&#xff0c;包含大量的背景&#xff0c;在进行器官分割时&#xff0c;首先去除背景对分割的效果有很好的提升。本博客使用Python处理医疗影像并去除背景的影像。使…

iOS APP提交上架最新流程

iOS APP提交上架最新流程 反复提交的过程中对上架流程熟悉了好多&#xff0c;写篇帖子送给同为菜鸟的你&#xff0c;如果里面有很菜的东西&#xff0c;大牛请自动忽略&#xff0c;毕竟这也是还为菜鸟的我的备忘录呢&#xff01; 首先得描述一下各个证书的定位&#xff0c;作…

Spring mvc Data Redis—Pub/Sub(附Web项目源码)

一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候&#xff0c;我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候&#xff0c;我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publish…

iOS分析崩溃日志

前言 iOS分析定位崩溃问题有很多种方式&#xff0c;但是发布到AppStore的应用如果崩溃了&#xff0c;我们该怎么办呢&#xff1f;通常我们都会在系统中接入统计系统&#xff0c;在系统崩溃的时候记录下崩溃日志&#xff0c;下次启动时将日志发送到服务端&#xff0c;比较好的第…

海思3559A上编译FFmpeg源码操作步骤

1. 从https://github.com/FFmpeg/FFmpeg/releases 下载你需要的版本&#xff1b; 2. 因为ffmpeg编译选项较多&#xff0c;为了更方便的了解有哪些选项&#xff0c;可将编译选项写入到一个文本文件configure_help.txt中&#xff0c;执行&#xff1a; ./configure --help > …

不到顶会现场也能听论文讲解?这个视频集合网站值得收藏

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

通过cat /proc/cpuinfo看处理器特点

2019独角兽企业重金招聘Python工程师标准>>> 在我的服务器上执行cat /proc/cpuinfo得到如下信息&#xff08;摘录最后一项&#xff0c;从0-23共24项&#xff09;&#xff1a; processor: 23&#xff1a;超线程技术的虚拟逻辑核第24个 vendor_id: GenuineIntel&#…

2016cocoapods安装流程及使用

一&#xff1a;参考安装流程&#xff1a;http://blog.csdn.NET/showhilllee/article/details/38398119/。 二&#xff1a;我的安装步骤。 1:安装cocoapods需要ruby&#xff0c;先查看ruby环境是不是最新版本。如果不是最新版本&#xff0c;需要先升级到最新版本。在终端输入以下…

FFmpeg中拉取rtsp视频流并缩放显示测试代码

之前在https://blog.csdn.net/fengbingchun/article/details/92198857中给出过仅拉取rtsp视频流的测试代码&#xff0c;这里在此代码的基础上进行扩充&#xff0c;包括设置使用多线程进行解码&#xff0c;使用sws_scale函数进行图像格式转换和缩放&#xff0c;并通过OpenCV进行…

全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | yuanziok来源 | CSDN原力计划获奖作品数据中台被誉为大数据的下一站&#xff0c;由阿里兴起&#xff0c;核心思想是数据共享&#xff0c;2015年阿里提出“大中台&#xff0c;小前台”的策略。2018 年因为“腾讯数据中台论”&#xff0c;中台再度…

【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

批处理是使GPU进行高效绘制的一种技术手段&#xff0c;也是整个渲染流程中最核心的技术&#xff0c;到目前为止我们并没有使用到这种技术手段&#xff0c;下面我们看看我们现在的渲染机制。 先想一想我们最开始是怎么向GPU绘制一幅图像的&#xff0c;可以回头查看Stage3D学习笔…