iOS关于沙盒文件读取的操作

//

//  ZGSandboxManager.h

//  SummaryDemo

//

//


#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>


typedef void (^ZGSandboxManagerResultHandler)(BOOL isSucceed, NSString *tipStr);

typedef void(^ZGSandboxManagerCacheHandler)(unsigned long long size, NSArray *list);


typedef NS_ENUM(NSInteger, ZGSandboxManagerPathType) {

    ZGSandboxManagerPathTypeDocument,

    ZGSandboxManagerPathTypeLibrary,

    ZGSandboxManagerPathTypeCache,

    ZGSandboxManagerPathTypeTmp,

};


typedef NS_ENUM(NSInteger, ZGSandboxManagerCustomPathType) {

    ZGSandboxManagerCustomPathTypeDocument,

    ZGSandboxManagerCustomPathTypeLibrary,

    ZGSandboxManagerCustomPathTypeCache,

    ZGSandboxManagerCustomPathTypeTmp,

};



@interface ZGSandboxManager : NSObject


@property (nonatomic, readonly) NSString *homeDirectory;

@property (nonatomic, readonly) NSString *documentDirectory;

@property (nonatomic, readonly) NSString *libraryDirectory;

@property (nonatomic, readonly) NSString *cachesDirectory;

@property (nonatomic, readonly) NSString *tmpDirectory;


@property (nonatomic, readonly) NSString *customDocumentDirectory;

@property (nonatomic, readonly) NSString *customLibraryDirectory;

@property (nonatomic, readonly) NSString *customCachesDirectory;

@property (nonatomic, readonly) NSString *customTmpDirectory;



+ (ZGSandboxManager *)sharedInstance;


/**

 把文件写入现有的指定的沙盒路径


 @param object 写入对象

 @param pathType 路径类型

 @param name 文件名称

 @param result 结果处理

 */

+ (void)writeObject:(id)object pathType:(ZGSandboxManagerPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result;



/**

 把文件写入自定义路径


 @param object 写入 对象

 @param pathType 自定义路径类型

 @param name 文件名称

 @param result 结果处理

 */

+ (void)writeObject:(id)object customPahtType:(ZGSandboxManagerCustomPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result;



/**

 获取缓存的大小


 @param cacheHandler 处理回调

 */

+ (void)getCacheSize:(ZGSandboxManagerCacheHandler)cacheHandler;



/**

 清除缓存


 @param cacheHandler 处理回调

 */

+ (void)clearCache:(ZGSandboxManagerCacheHandler)cacheHandler;



@end


 




//

//  ZGSandboxManager.m

//  SummaryDemo

//


#import "ZGSandboxManager.h"


@interface ZGSandboxManager ()


@property (nonatomic, copy) NSString *documentDirectory;

@property (nonatomic, copy) NSString *libraryDirectory;

@property (nonatomic, copy) NSString *cachesDirectory;

@property (nonatomic, copy) NSString *tmpDirectory;


@property (nonatomic, copy) NSString *customDocumentDirectory;

@property (nonatomic, copy) NSString *customLibraryDirectory;

@property (nonatomic, copy) NSString *customCachesDirectory;

@property (nonatomic, copy) NSString *customTmpDirectory;


@property (nonatomic, strong) NSMutableArray *files;


@end



@implementation ZGSandboxManager


+ (void)writeObject:(id)object pathType:(ZGSandboxManagerPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result

{

    [[ZGSandboxManager sharedInstance] writeObject:object pathType:pathType name:name result:result];

}


+ (void)writeObject:(id)object customPahtType:(ZGSandboxManagerCustomPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result

{

    [[ZGSandboxManager sharedInstance] writeObject:object customPahtType:pathType name:name result:result];

}


+ (ZGSandboxManager *)sharedInstance

{

    static ZGSandboxManager *manager = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        manager = [[ZGSandboxManager alloc] init];

    });

    return manager;

}


- (instancetype)init

{

    self = [super init];

    if (self) {

        [self saveSetByNSUserDefaults];

        [self useNSMutableData];

        

        self.files = @[].mutableCopy;

    }

    return self;

}


- (void)writeObject:(id)object pathType:(ZGSandboxManagerPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result

{

    NSString *path = nil;

    switch (pathType) {

        case ZGSandboxManagerPathTypeDocument:

            path = self.documentDirectory;

            break;

        case ZGSandboxManagerPathTypeLibrary:

            path = self.libraryDirectory;

            break;

        case ZGSandboxManagerPathTypeCache:

            path = self.cachesDirectory;

            break;

        case ZGSandboxManagerPathTypeTmp:

            path = self.tmpDirectory;

            break;

            

        default:

            break;

    }

    

    path = [path stringByAppendingPathComponent:name];

    if (!path) {

        if (result) {

            result(NO, @"写入失败");

        }

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

        [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

    }

    

    BOOL isSucceed = [NSKeyedArchiver archiveRootObject:object toFile:path];

    if (isSucceed) {

        if (result) {

            result(YES, @"写入成功");

        }

    }

    else {

        if (result) {

            result(NO, @"写入失败");

        }

    }

}


- (void)writeObject:(id)object customPahtType:(ZGSandboxManagerCustomPathType)pathType name:(NSString *)name result:(ZGSandboxManagerResultHandler)result

{

    NSString *path = nil;

    switch (pathType) {

        case ZGSandboxManagerCustomPathTypeDocument:

            path = self.customDocumentDirectory;

            break;

        case ZGSandboxManagerCustomPathTypeLibrary:

            path = self.customLibraryDirectory;

            break;

        case ZGSandboxManagerCustomPathTypeCache:

            path = self.customCachesDirectory;

            break;

        case ZGSandboxManagerCustomPathTypeTmp:

            path = self.customTmpDirectory;

            break;

            

        default:

            break;

    }

    

    path = [path stringByAppendingPathComponent:name];

    if (!path) {

        if (result) {

            result(NO, @"写入失败");

        }

        return;

    }

    

    if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

        [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

    }

    

    BOOL isSucceed = [NSKeyedArchiver archiveRootObject:object toFile:path];

    if (isSucceed) {

        if (result) {

            result(YES, @"写入成功");

        }

    }

    else {

        if (result) {

            result(NO, @"写入失败");

        }

    }

}


#pragma mark - 自定义的文件夹

- (NSString *)customHomeDirectory

{

    NSString *customDirectory = [self.homeDirectory stringByAppendingPathComponent:@"customHomeDirectory"];

    BOOL isDir;

    if ([[NSFileManager defaultManager] fileExistsAtPath:customDirectory isDirectory:&isDir] && isDir) {

        return customDirectory;

    }

    NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:customDirectory withIntermediateDirectories:YES attributes:nil error:&error];

    if (error) {

        return nil;

    }

    return customDirectory;

}


- (NSString *)customDocumentDirectory

{

    NSString *customDirectory = [self.documentDirectory stringByAppendingPathComponent:@"customDocumentDirectory"];

    BOOL isDir;

    if ([[NSFileManager defaultManager] fileExistsAtPath:customDirectory isDirectory:&isDir] && isDir) {

        return customDirectory;

    }

    NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:customDirectory withIntermediateDirectories:YES attributes:nil error:&error];

    if (error) {

        return nil;

    }

    return customDirectory;

}


- (NSString *)customLibraryDirectory

{

    NSString *customDirectory = [self.libraryDirectory stringByAppendingPathComponent:@"customLibraryDirectory"];

    BOOL isDir;

    if ([[NSFileManager defaultManager] fileExistsAtPath:customDirectory isDirectory:&isDir] && isDir) {

        return customDirectory;

    }

    

    NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:customDirectory withIntermediateDirectories:YES attributes:nil error:&error];

    if (error) {

        return nil;

    }

    return customDirectory;

}


- (NSString *)customCachesDirectory

{

    NSString *customDirectory = [self.cachesDirectory stringByAppendingPathComponent:@"customCachesDirectory"];

    BOOL isDir;

    if ([[NSFileManager defaultManager] fileExistsAtPath:customDirectory isDirectory:&isDir] && isDir) {

        return customDirectory;

    }

    

    NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:customDirectory withIntermediateDirectories:YES attributes:nil error:&error];

    if (error) {

        return nil;

    }

    return customDirectory;

}


- (NSString *)customTmpDirectory

{

    NSString *customDirectory = [self.tmpDirectory stringByAppendingPathComponent:@"customTmpDirectory"];

    BOOL isDir;

    if ([[NSFileManager defaultManager] fileExistsAtPath:customDirectory isDirectory:&isDir] && isDir) {

        return customDirectory;

    }

    

    NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:customDirectory withIntermediateDirectories:YES attributes:nil error:&error];

    if (error) {

        return nil;

    }

    return customDirectory;

}


#pragma mark - 获取沙盒路径

//1、获取程序的Home目录

- (NSString *)homeDirectory

{

    NSString *homeDirectory = NSHomeDirectory();

    NSLog(@"获取程序的Home目录:%@", homeDirectory);

    return homeDirectory;

}


//2、获取document目录

- (NSString *)documentDirectory

{

    /*

     *Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。

     */

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    NSLog(@"获取document目录:%@", path);

    return path;

}


//3、获取Library目录

- (NSString *)libraryDirectory

{

    /*

     * Library 目录:这个目录下有两个子目录:

     * Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.

     * Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

     * 可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。

     */

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

    NSLog(@"获取Library目录:%@", path);

    return path;

}


//4、获取Cache目录

- (NSString *)cachesDirectory

{

    /*

     * Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。

     */

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    NSLog(@"获取Cache目录:%@", path);

    return path;

}


//5、获取Tmp目录

- (NSString *)tmpDirectory

{

    /*

     * tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。

     */

    NSString *path = NSTemporaryDirectory();

    NSLog(@"获取Tmp目录:%@", path);

    return path;

}


#pragma mark - 保存数据到NSUserDefaults

-(void)saveSetByNSUserDefaults

{

    /*

     * Library/Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。

     * 使用NSUserDefaults保存的设置存放在Library/Preferences目录下面。

     */

    

    NSString *myString = @"赵刚";

    int myInteger = 100;

    float myFloat = 50.0f;

    double myDouble = 20.0;

    NSDate *myDate = [NSDate date];

    NSArray *myArray = [NSArray arrayWithObjects:@"hello", @"world", nil];

    NSDictionary *myDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"enuo", @"20", nil] forKeys:[NSArray arrayWithObjects:@"name", @"age", nil]];

    

    //将上述数据全部存储到NSUserDefaults中

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    //存储时,除NSNumber类型使用对应的类型意外,其他的都是使用setObject:forKey:

    [userDefaults setInteger:myInteger forKey:@"myInteger"];

    [userDefaults setFloat:myFloat forKey:@"myFloat"];

    [userDefaults setDouble:myDouble forKey:@"myDouble"];

    

    [userDefaults setObject:myString forKey:@"myString"];

    [userDefaults setObject:myDate forKey:@"myDate"];

    [userDefaults setObject:myArray forKey:@"myArray"];

    [userDefaults setObject:myDictionary forKey:@"myDictionary"];

    

    //这里建议同步存储到磁盘中,但是不是必须的

    [userDefaults synchronize];

    

    [self readUserDefaultsSet];

}


//从NSUserDefaults中读取数据

-(void)readUserDefaultsSet

{

    NSUserDefaults *userDefaultes = [NSUserDefaults standardUserDefaults];

    

    //读取数据到各个label中

    //读取整型int类型的数据

    NSInteger myInteger = [userDefaultes integerForKey:@"myInteger"];

    NSLog(@"%ld",(long)myInteger);

    

    //读取浮点型float类型的数据

    float myFloat = [userDefaultes floatForKey:@"myFloat"];

    NSLog(@"%f", myFloat);

    

    //读取double类型的数据

    double myDouble = [userDefaultes doubleForKey:@"myDouble"];

    NSLog(@"%f",myDouble);

    

    //读取NSString类型的数据

    NSString *myString = [userDefaultes stringForKey:@"myString"];

    NSLog(@"%@",myString);

    

    //读取NSDate日期类型的数据

    NSDate *myDate = [userDefaultes valueForKey:@"myDate"];

    NSDateFormatter *df = [[NSDateFormatter alloc] init];

    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSLog(@"NSString stringWithFormat:%@",[df stringFromDate:myDate]);

    

    //读取数组NSArray类型的数据

    NSArray *myArray = [userDefaultes arrayForKey:@"myArray"];

    NSString *myArrayString = [[NSString alloc] init];

    for(NSString *str in myArray) {

        NSLog(@"str= %@",str);

        myArrayString = [NSString stringWithFormat:@"%@  %@", myArrayString, str];

        [myArrayString stringByAppendingString:str];

        NSLog(@"myArrayString=%@",myArrayString);

    }

    

    //读取字典类型NSDictionary类型的数据

    NSDictionary *myDictionary = [userDefaultes dictionaryForKey:@"myDictionary"];

    NSString *myDicString = [NSString stringWithFormat:@"name:%@, age:%d",[myDictionary valueForKey:@"name"], [[myDictionary valueForKey:@"age"] intValue]];

    NSLog(@"%@", myDicString);

}


#pragma mark - 用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来

- (void)useNSMutableData

{

    NSString * fileName = @"testFileNSFileManager.txt";

    //获取文件路径

    NSString *path = [self.documentDirectory stringByAppendingPathComponent:fileName];

    //待写入的数据

    NSString *temp = @"nihao 世界";

    int dataInt = 1234;

    float dataFloat = 3.14f;

    //创建数据缓冲

    NSMutableData *writer = [[NSMutableData alloc] init];

    //将字符串添加到缓冲中

    [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];

    //将其他数据添加到缓冲中

    [writer appendBytes:&dataInt length:sizeof(dataInt)];

    [writer appendBytes:&dataFloat length:sizeof(dataFloat)];

    //将缓冲的数据写入到文件中

    [writer writeToFile:path atomically:YES];

    

    //读取数据:

    int intData;

    float floatData = 0.0;

    NSString *stringData;

    

    NSData *reader = [NSData dataWithContentsOfFile:path];

    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]

                                       encoding:NSUTF8StringEncoding];

    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];

    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];

    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);

}



#pragma mark - 清除缓存


+ (void)clearCache:(ZGSandboxManagerCacheHandler)cacheHandler

{

    [[ZGSandboxManager sharedInstance] clearCache:cacheHandler];

}


- (void)clearCache:(ZGSandboxManagerCacheHandler)handler

{

    [ZGSandboxManager getCacheSize:^(unsigned long long size, NSArray *list) {

        

        for (NSString *path in list) {

            if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

                [[NSFileManager defaultManager] removeItemAtPath:path error:nil];

            }

        }

        

        [ZGSandboxManager getCacheSize:^(unsigned long long size, NSArray *list) {

            if (handler) {

                handler(size, list);

            }

        }];

    }];

}


+ (void)getCacheSize:(ZGSandboxManagerCacheHandler)cacheHandler

{

    [[ZGSandboxManager sharedInstance] getCacheSize:cacheHandler];

}


- (void)getCacheSize:(ZGSandboxManagerCacheHandler)cacheHandler

{

    [self.files removeAllObjects];

    

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        unsigned long long size = [self folderSizeAtPath:self.cachesDirectory];

        

        dispatch_async(dispatch_get_main_queue(), ^{

            if (cacheHandler) {

                NSLog(@"当前文件夹占用的内存是:%@MB", @(size));

                cacheHandler(size, self.files);

            }

        });

    });

}


// 计算整个文件夹中所有文件大小

- (unsigned long long)folderSizeAtPath:(NSString*)folderPath

{

    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:folderPath];

    if (isExist){

        NSEnumerator *childFileEnumerator = [[[NSFileManager defaultManager] subpathsAtPath:folderPath] objectEnumerator];

        unsigned long long folderSize = 0.0;

        NSString *fileName = @"";

        while ((fileName = [childFileEnumerator nextObject]) != nil){

            NSString* fileAbsolutePath = [folderPath stringByAppendingPathComponent:fileName];

            folderSize += [self fileSizeAtPath:fileAbsolutePath];

        }

        return folderSize / (1024.0 * 1024.0);

    }

    else {

        return 0;

    }

}


// 计算单个文件大小

- (unsigned long long)fileSizeAtPath:(NSString *)filePath

{

    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];

    if (isExist){

        [self.files addObject:filePath];

        

        unsigned long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];

        return fileSize;

    }

    else {

        return 0;

    }

}



@end





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS 上,应用的沙盒目录是私有的,其他应用无法直接访问。因此,要从 JS 中获取 iOS 沙盒内的文件,需要通过 Native Bridge 的方式,即将 JS 中的请求传递给原生代码,由原生代码来实现文件读取并返回结果给 JS。 以下是一个简单的示例,假设你要获取沙盒内的一个名为 `example.txt` 的文件: 1. 在原生代码中实现文件读取逻辑,例如使用 `NSFileManager` 类读取文件内容: ```objc - (NSString *)readFileContentsAtPath:(NSString *)path { NSFileManager *fileManager = [NSFileManager defaultManager]; NSData *data = [fileManager contentsAtPath:path]; return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } ``` 2. 在 JS 中定义一个函数,用于调用原生代码并获取文件内容: ```js function getExampleFileContents() { // 调用 Native Bridge 方法,传递路径参数 const path = 'path/to/example.txt'; const contents = NativeBridge.readFileContentsAtPath(path); return contents; } ``` 3. 在原生代码中实现 Native Bridge 方法,并将其暴露给 JS 环境: ```objc - (void)registerNativeBridgeMethods { [self.bridge registerNativeMethod:@"readFileContentsAtPath" handler:^(NSString *path) { NSString *contents = [self readFileContentsAtPath:path]; // 将结果返回给 JS 环境 [self.bridge callHandler:@"onFileContentsReceived" withArguments:@[contents]]; }]; } ``` 4. 在 JS 中注册 `onFileContentsReceived` 回调函数,用于接收原生代码返回的文件内容: ```js function onFileContentsReceived(contents) { // 处理文件内容 console.log(contents); } NativeBridge.registerEventHandler('onFileContentsReceived', onFileContentsReceived); ``` 注意:以上示例仅为演示 Native Bridge 的基本用法,具体实现方式可能因框架、平台、业务需求等因素而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值