iOS数据持久化(1)-文件读写

1.沙盒机制

iOS采用沙盒机制管理应用,应用只能访问自己目录下的文件。iOS不像Android,没有SD卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。

iOS数据持久化(1)-文件读写_第1张图片
沙盒内目录结构

我们无法在未越狱的真机中看到沙盒的内容(这保证了应用数据的安全性),但是我们可以看到模拟器的沙盒的内容,从而方便调试,沙盒的内容,一般在类似如下路径:
~/Library/Developer/CoreSimulator/Devices/E0D702A7-D760-44F9-9226-FD176E80C158/data/Containers/Data/Application/02A2499B-A34E-4A86-B555-5DB9179521DB/

沙盒路径非常复杂,所以推荐使用SimPolders2 Mac应用来查找应用沙盒的路径

iOS数据持久化(1)-文件读写_第2张图片
SimHolders2
2.目录结构

下面介绍一下沙盒内各个路径的用途:
Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录。
Library:存储程序的默认设置或其它状态信息。
Library/Preferences:存放用户偏好设置信息。
Library/Caches:存放缓存文件,保存应用的持久化数据,用于应用升级或者应用关闭后的数据保存,不会被itunes同步,所以为了减少同步的时间,可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
tmp:提供一个即时创建临时文件的地方,但不需要持久化,在应用关闭后,该目录下的数据将删除,也可能系统在程序不运行的时候清除。

3.代码操作

//获取沙盒根目录
+(NSString*)homeDirectory{
    
    return NSHomeDirectory();

}

//获取Documents目录
+(NSString *)documentDirectory{
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    return documentsDirectory;
}

//获取Cache目录
+(NSString *)cacheDirectory{
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    return cachePath;
}

//获取tmp目录
+(NSString *)tmpDirectory{

    return NSTemporaryDirectory();
}

//文件或文件夹是否存在
+(BOOL)fileExistInPath:(NSString*)path isDirectory:(nullable BOOL *)isDirectory{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL existed = [fileManager fileExistsAtPath:path isDirectory:isDirectory];
    return existed;
}

//创建文件夹
+(BOOL)createDirectoryInPath:(NSString*)path directoryName:(NSString*)name{

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *newDirectory = [path stringByAppendingPathComponent:name];
    // 创建目录
    BOOL res = [fileManager createDirectoryAtPath:newDirectory withIntermediateDirectories:YES attributes:nil error:nil];
    if (res) {
        //文件夹创建成功
        return YES;
    }else{
        //文件夹创建失败
        return NO;
    }
}

//创建文件
+(BOOL)createFileInPath:(NSString*)path fileName:(NSString*)fileName{

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *newFilePath = [path stringByAppendingPathComponent:fileName];
    BOOL res = [fileManager createFileAtPath:newFilePath contents:nil attributes:nil];
    if (res) {
        //文件创建成功
        return YES;
    }else{
        //文件创建失败
        return NO;
    }
}

//写文件
+(BOOL)writeStringToFile:(NSString*)string inPath:(NSString*)path{
    
    BOOL res=[string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if (res) {
        //文件写入成功
        return YES;
    }else{
        //文件写入失败
        return NO;
    }
}

//读文件
+(NSString*)readFileInPath:(NSString*)path{

    NSString *content=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    return content;
}

//文件属性
+(NSDictionary *)fileAttriutesInPath:(NSString*)path{
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path error:nil];
    return [fileAttributes copy];
}

//删除文件
+(BOOL)deleteFileInPath:(NSString*)path{

    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL res = [fileManager removeItemAtPath:path error:nil];
    if (res) {
        //文件删除成功
        return YES;
    }else{
        //文件删除失败
        return NO;
    }
}

4. GitHub

整个数据持久化操作的Demo代码,都存储在GitHub中

其中文件操作的内容,在RACFileManager类中

你可能感兴趣的:(iOS数据持久化(1)-文件读写)