FZEasyFile的使用

简介:

FZEasyFile的使用

https://github.com/jiecao-fm/FZEasyFile

 

操作沙盒文件很恶心,但用上FZEasyFile就变得简单了.

以前你需要这么做才行:

NSFileManager *fileManager = [NSFileManager defaultManager];

    //获取document路径,括号中属性为当前应用程序独享
    NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDirectory = [directoryPaths objectAtIndex:0];

    //查找文件夹,如果不存在,就创建一个文件夹
    NSString *dir = [documentDirectory stringByAppendingPathComponent:@SAVEDIR];
    NSLog(@"cache dir %@", dir);
    if(![fileManager fileExistsAtPath:dir])
    {
        if(![fileManager createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:nil])
        {
            NSLog(@"create dir:(%@) error", dir);
            return;
        }
    }

    //定义记录文件全名以及路径的字符串filePath
    NSString *filePath = [dir stringByAppendingPathComponent:[[NSString alloc]initWithFormat:@"/%@", filename]];

    //查找文件,如果不存在,就创建一个文件
    NSData *data = [lHtml dataUsingEncoding:NSUTF8StringEncoding];
    if (![fileManager fileExistsAtPath:filePath]) {
        [fileManager createFileAtPath:filePath contents:data attributes:nil];
    }

现在你只需要这么做:
FZEasyFile *easyFile = [FZEasyFile sharedInstance];
[easyFile createFile:fileName overwrite:NO];
NSOutputStream *output = [NSOutputStream outputStreamToFileAtPath:[easyFile fullFileName:fileName] append:NO];

so easy :)

 

附录:

以下为我自己修改的版本,感谢原作者的分享精神!

EasyFile.h


//
//  EasyFile.h
//  EasyFile
//
//  Copyright (c) 2014年 zhou jun All rights reserved.
//

#import <Foundation/Foundation.h>

typedef enum
{
    
    /*
     /Documents
     /Library/Caches
     /Library/Preferences
     /tmp
     */
    
    DOCUMENTS = 0x99,
    CACHES,
    PREFERENCES,
    TMP,
    
} EFolderFlag;

@interface EasyFile : NSObject

/**
 convert the short file name to full file name. e.g. "mycache/user/icon.png" -> "/Users/zhoujun/Library/Application Support/iPhone Simulator/7.1/Applications/ABCE2119-E864-4492-A3A9-A238ADA74BE5/Documents/mycache/user/icon.png".
 @return full file name.
 */
+ (NSString *)fullFileName:(NSString *)shortFileName folderType:(EFolderFlag)type;

/**
 create a file
 @param fileName fileName file path and file name, e.g. "mycache/user/icon.png".
 @param shouldOverwrite YES:if the file exists then overwirte it, NO:if the file exists then do nothing
 */
+ (void)createFile:(NSString *)fileName overwrite:(BOOL)flag folderType:(EFolderFlag)type;

/**
 test if the file exists.
 @param fileName file path and file name, e.g. "mycache/user/icon.png".
 @return YES if exists, NO otherwise.
 */
+ (BOOL)isFileExists:(NSString *)fileName folderType:(EFolderFlag)type;

@end

EasyFile.m


//
//  EasyFile.m
//  EasyFile
//
//  Copyright (c) 2014年 zhou jun All rights reserved.
//

#import "EasyFile.h"

@implementation EasyFile

+ (NSString *)fullFileName:(NSString *)shortFileName folderType:(EFolderFlag)type
{
    NSString *rootPath = NSHomeDirectory();
    
    switch (type)
    {
        case DOCUMENTS:
            rootPath = [NSHomeDirectory() stringByAppendingString:@"/Documents"];
            break;
          
        case CACHES:
            rootPath = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches"];
            break;
            
        case PREFERENCES:
            rootPath = [NSHomeDirectory() stringByAppendingString:@"/Library/Preferences"];
            break;
            
        case TMP:
            rootPath = [NSHomeDirectory() stringByAppendingString:@"/tmp"];
            break;
            
        default:
            rootPath = [NSHomeDirectory() stringByAppendingString:@"/Documents"];
            break;
    }

    NSString *file = [rootPath stringByAppendingPathComponent:shortFileName];
    
    return file;
}

+ (void)createFile:(NSString *)fileName overwrite:(BOOL)flag folderType:(EFolderFlag)type
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSRange lastTag = [fileName rangeOfString:@"/" options:NSBackwardsSearch];
    
    if (lastTag.location != NSNotFound && lastTag.location != 0)
    {
        NSString *shortDir = [fileName substringToIndex:lastTag.location];
        NSString *fullDir  = [self fullFileName:shortDir folderType:type];
        
        if (![fileManager fileExistsAtPath:fullDir])
        {
            [fileManager createDirectoryAtPath:fullDir
                   withIntermediateDirectories:YES
                                    attributes:nil
                                         error:nil];
        }
    }
    
    NSString *file = [self fullFileName:fileName folderType:type];
    
    if (flag || ![fileManager fileExistsAtPath:file])
    {
        BOOL suc = [fileManager createFileAtPath:file contents:nil attributes:nil];
        NSLog(@"create file(%@) %@", file, suc ? @"successfully" : @"failed");
    }
}

+ (BOOL)isFileExists:(NSString *)fileName folderType:(EFolderFlag)type
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *file = [self fullFileName:fileName folderType:type];
    return [fileManager fileExistsAtPath:file];
}

@end




目录
相关文章
|
机器学习/深度学习 并行计算 PyTorch
PyTorch安装教程
PyTorch是学习深度学习时常用的Python神经网络框架,本文将介绍其部分版本的安装方式。Windows和Linux通用。 作者使用anaconda作为管理虚拟环境的工具。以下工作都在虚拟环境中进行,对Python和Aanaconda的安装及对虚拟环境的管理本文不作赘述,后期可能会撰写相关的博文。
PyTorch安装教程
|
4月前
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
|
5月前
|
Java 关系型数据库 数据库
【SpringBoot系列】微服务集成Flyway
【4月更文挑战第7天】SpringBoot微服务集成Flyway
278 1
【SpringBoot系列】微服务集成Flyway
|
11月前
|
应用服务中间件 nginx
如何安装Nginx
如何安装Nginx
216 0
|
tengine 负载均衡 算法
Nginx的安装
Nginx的安装
|
5月前
|
缓存 负载均衡 Java
大规模 Spring Cloud 微服务无损上下线探索与实践
“从一次常见的发布说起,在云上某个系统应用发布时,重启阶段会导致较大数量的 OpenAPI、上游业务的请求响应时间明显增加甚至超时失败。随着业务的发展,用户数和调用数越来越多,该系统又一直保持一周发布二次的高效迭代频率,发布期间对业务的影响越来越无法接受,微服务下线的治理也就越来越紧迫。”
大规模 Spring Cloud 微服务无损上下线探索与实践
|
5月前
|
Kubernetes 测试技术 微服务
白天大流量下发布依然如丝般顺滑
为什么很多互联网公司不敢在白天发布,都选择在半夜发布。要是能摆脱半夜发布的窘境,它不香吗?选择在半夜发布无非是为了减少对用户的影响,出了问题影响面可控。那我们就来谈谈,发布会有哪些问题若您的应用没有上下线的问题,您的任何应用在发布的过程中会造成短暂的服务不可用,短时间内业务监控会出现大量 io 异常...
白天大流量下发布依然如丝般顺滑
|
5月前
|
SQL 存储 数据挖掘
Serverless数据仓库实践,助力企业敏捷数据分析
现代的云原生数据仓库架构传统的云数据仓库需要用户购买一个预置的数据资源进行7*24的长时间运行;这种方式对于当下崇尚敏捷创业者来说使用负担较大,对于探索类或成长型业务缺少灵活的使用模式以满足低成本数据分析诉求;随着这个问题被越来越多的企业关注,Serverless的使用方式开始逐渐被各大厂商提及,B...
Serverless数据仓库实践,助力企业敏捷数据分析
|
机器学习/深度学习 人工智能
人工智能实践 | VGG-16迁移模型
传统的机器学习训练模型需要大量的标签数据,而且每一个模型是为了解决特定任务设计的,所以当面对全新领域问题就显得无能为力,因此采用迁移学习来解决不同领域之间知识迁移问题,能达到“举一反三”的作用,使学习性能显著提高。
355 0
|
5月前
|
Dubbo Java 应用服务中间件
微服务治理热门技术揭秘:无损上线
本文一一介绍了微服务治理的热门技术无损上线的方案与实现的细节。
微服务治理热门技术揭秘:无损上线