IOS学习笔记 - NSFileManager,沙盒路径,NSString类路径处理,NSCache,读取文件头判断图片类型

1,沙盒路径的一些操作

IOS沙盒路径:
iOS的沙盒机制,应用只能访问自己应用目录下的文件。iOS不像android,没有SD卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。
Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,保存应用的持久化数据,用于应用升级或者应用关闭后的数据保存,不会被itunes同步,所以为了减少同步的时间,可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
tmp:提供一个即时创建临时文件的地方,但不需要持久化。设备重启时候数据将被清空。
获取沙盒路径的方法:

- (void)box
{
    
    //1,获取沙盒路径
    NSString *homePath = NSHomeDirectory();
    NSLog(@"homePath = %@", homePath);
    
    //2,获取Documents路径
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSArray *path1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pathDocument = [path1 objectAtIndex:0];
    NSLog(@"pathDocument = %@", pathDocument);
    
    //3,获取Library路径
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *pathLibrary = [path2 objectAtIndex:0];
    NSLog(@"pathLibrary = %@", pathLibrary);
    
    //4,获取Cache路径
    NSArray *path3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *pathCache = [path3 objectAtIndex:0];
    NSLog(@"pathCache = %@", pathCache);
    
    //5,获取tmp路径
    //[NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
    NSString *pathTmp = NSTemporaryDirectory();
    NSLog(@"pathTmp = %@", pathTmp);
    

}

2,NSFileManager的相关操作

- (void)testFileManager
{
    NSArray *path1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pathDocument = [path1 objectAtIndex:0];
    
    //1,创建文件夹(目录)
    NSString *pathGroup = [pathDocument stringByAppendingPathComponent:@"pathGroup"];
    BOOL createFileGroup = [[NSFileManager defaultManager] createDirectoryAtPath:pathGroup withIntermediateDirectories:YES attributes:nil error:nil];
    if (createFileGroup) {
        NSLog(@"文件夹创建成功");
    }else{
        NSLog(@"文件夹创建失败");
    }
    
    //2,创建文件
    NSString *pathFile0 = [pathGroup stringByAppendingPathComponent:@"pathGroup.txt"];
    BOOL createFile = [[NSFileManager defaultManager] createFileAtPath:pathFile0 contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    if (createFile) {
        NSLog(@"创建文件成功");
    }else{
        NSLog(@"创建文件失败");
    }
    
    //3,判断一个文件是否存在
    NSString *pathFile1 = [pathDocument stringByAppendingPathComponent:@"abc.txt"];
    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:pathFile0];
    if (isExist) {
        NSLog(@"pathFile1 Exist");
    }else{
        NSLog(@"pathFile1 Not Exist");
    }
    
    //4,读取文件内容
//    NSData *data = [fileManger contentsAtPath:myFilePath];//myFilePath是包含完整路径的文件名
//    NSData *data = [NSData dataWithContentsOfFile:pathFile0];
//    NSString *fileContents = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSString *fileContents = [NSString stringWithContentsOfFile:pathFile0 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"文件读取成功 %@", fileContents);
    
    //5,写数据到文件
    NSString *contents = [fileContents stringByAppendingString:@"\n sdf\n新添加的数据"];
    [contents writeToFile:pathFile0 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    /*- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
     或 NSData 的
     - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
     - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr; */
    
    //6,读取文件属性
    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:pathFile0 error:nil];
    NSArray *allKeys = [dict allKeys];
    for (id key in allKeys) {
        NSLog(@"key : %@", key);
        NSLog(@"value : %@ ", [dict objectForKey:key]);
    }
    
    //7,文件重命名
    //一般都是通过移动一个文件来给文件重命名
//    [fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error];
    
    //8,删除文件,
    BOOL deleteFile = [[NSFileManager defaultManager] removeItemAtPath:pathFile0 error:nil];//如果pathFile0是一个路径,则会删除文件夹下所有的内容
    if (deleteFile) {
        NSLog(@"删除文件成功");
    }else{
        NSLog(@"删除文件失败");
    }
    NSLog(@"文件是否存在 %@", [[NSFileManager defaultManager] fileExistsAtPath:pathFile0]?@"YES":@"NO");
    [[NSFileManager defaultManager] isExecutableFileAtPath:pathFile0];
    
    //9,获取一个目录下所有的文件名
    //两个方法返回数据一样,返回指定目录下所有的文件夹和文件的目录
    NSArray *file = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath: NSHomeDirectory() error:nil];
    NSArray *files = [[NSFileManager defaultManager] subpathsAtPath: NSHomeDirectory() ];
    
    
    //10,比较文件内容是否相同
    // - (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2;

    
    
    //11,下面这几个方法,可以在操作文件之前先判断是否可以操作,比如是否可以读取,可读的时候再取读取,为了避免不必要的错误
//    - (BOOL)fileExistsAtPath:(NSString *)path;
//    - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
//    - (BOOL)isReadableFileAtPath:(NSString *)path;
//    - (BOOL)isWritableFileAtPath:(NSString *)path;
//    - (BOOL)isExecutableFileAtPath:(NSString *)path;
//    - (BOOL)isDeletableFileAtPath:(NSString *)path;
    
    /*
     12,赋值,移动,创建快捷方式,删除文件
     //These methods replace their non-error returning counterparts below. See the NSFileManagerDelegate protocol below for methods that are dispatched to the NSFileManager instance's delegate.
    - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)linkItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);*/
}

3,NSString类路径的处理方法

文件路径的处理
NSString *path = @"/Uesrs/apple/testfile.txt"

常用方法如下
//1 获得组成此路径的各个组成部分,结果:("/","User","apple","testfile.txt")
- (NSArray *)pathComponents;

//2 提取路径的最后一个组成部分,结果:testfile.txt
- (NSString *)lastPathComponent;

//3 删除路径的最后一个组成部分,结果:/Users/apple
- (NSString *)stringByDeletingLastPathCpmponent;

//4 将path添加到已有路径的末尾,结果:/Users/apple/testfile.txt/app.txt
- (NSString *)stringByAppendingPathConmponent:(NSString *)str;

//5 去路径最后部分的扩展名,结果:text
- (NSString *)pathExtension;

//6 删除路径最后部分的扩展名,结果:/Users/apple/testfile
- (NSString *)stringByDeletingPathExtension;

//7 路径最后部分追加扩展名,结果:/User/apple/testfile.txt.jpg
- (NSString *)stringByAppendingPathExtension:(NSString *)str;

4,NSData常用操作

NSData是用来包装数据的
NSData存储的是二进制数据,屏蔽了数据之间的差异,文本、音频、图像等数据都可用NSData来存储

NSData的用法
1.NSString与NSData互相转换
<strong>NSData-> NSString  </strong>                                                                                   NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding];

<strong>NSString->NSData  </strong>                                                                                    NSString *aString = @"1234abcd";
NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding]; 

<strong>将data类型的数据,转成UTF8的数据</strong>
+(NSString *)dataToUTF8String:(NSData *)data
{
NSString *buf = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [buf autorelease];
}

<strong>将string转换为指定编码</strong> 
+(NSString *)changeDataToEncodinString:(NSData *)data encodin:(NSStringEncoding )encodin{
    NSString *buf = [[[NSString alloc] initWithData:data encoding:encodin] autorelease];
    return buf;
}

2. NSData 与 UIImage
NSData->UIImage
UIImage *aimage = [UIImage imageWithData: imageData];
 
//例:从本地文件沙盒中取图片并转换为NSData
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *name = [NSString stringWithFormat:@"ceshi.png"];
NSString *finalPath = [path stringByAppendingPathComponent:name];
NSData *imageData = [NSData dataWithContentsOfFile: finalPath];
UIImage *aimage = [UIImage imageWithData: imageData];

3.NSData与NSArray  NSDictionary
+(NSString *)getLocalFilePath:(NSString *) fileName
{
return [NSString stringWithFormat:@"%@/%@%@", NSHomeDirectory(),@“Documents”,fileName];
}

包括将NSData写进Documents目录
从Documents目录读取数据
在进行网络数据通信的时候,经常会遇到NSData类型的数据。在该数据是dictionary结构的情况下,系统没有提供现成的转换成NSDictionary的方法,为此可以通过Category对NSDictionary进行扩展,以支持从NSData到NSDictionary的转换。声明和实现如下:
 
+ (NSDictionary *)dictionaryWithContentsOfData:(NSData *)data {     
    CFPropertyListRef list = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)data, kCFPropertyListImmutable, NULL);
    if(list == nil) return nil; 
    if ([(id)list isKindOfClass:[NSDictionary class]]) { 
         return [(NSDictionary *)list autorelease]; 
        } 
    else { 
         CFRelease(list); 
         return nil; 
        } 
}


5,NSCache

NSCache 在系统内存很低时,会自动释放一些对象
备注:这句话源自苹果的官方文档,不过在模拟器中模拟内存警告时,缓存不会做清理动作 为了确保接收到内存警告时能够真正释放内存,最好调用一下 removeAllObjects 方法
NSCache 是线程安全的,在多线程操作中,不需要对 Cache 加锁
NSCache 的 Key 只是做强引用,不需要实现 NSCopying 协议

<pre name="code" class="objc">@interface NSCache : NSObject {
@private
    id _delegate;
    void *_private[5];
    void *_reserved;
}

@property (copy) NSString *name;

@property (assign) id<NSCacheDelegate> delegate;

//1,向NSCache对象中添加和取出对象的方法和 字典的操作类似
- (id)objectForKey:(id)key;
- (void)setObject:(id)obj forKey:(id)key; // 0 cost
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
- (void)removeObjectForKey:(id)key;

- (void)removeAllObjects;
//2,总共的花费,就是总共要占用的资源,开发一般用不到
@property NSUInteger totalCostLimit;	// limits are imprecise/not strict
//3,对象中最多缓存的数量,超出数量的将被删除
@property NSUInteger countLimit;	// limits are imprecise/not strict/Default is 0, No limit
@property BOOL evictsObjectsWithDiscardedContent;

@end

@protocol NSCacheDelegate <NSObject>
@optional
//4,NSCache的代理方法,一般用于程序员调试,obj表示将要被删除的对象
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
@end
 
 

6,读文件头判断文件类型

mimeType 类型

http://www.w3school.com.cn/media/media_mimeref.asp

关于图片格式

// 图片的格式
PNG: 无损压缩!压缩比较低。 PNG图片一般会JPG大。
- GPU解压缩的消耗非常小。解压缩的速度比较快,比较清晰,苹果推荐使用
JPG: 有损压缩!压缩比非常高!照相机使用。
- GPU解压缩的消耗比较大
GIF: 可动画的图片
BMP: (位图),没有任何压缩。几乎不用
几种常见格式文件的文件头内容

1.JPEG
- 文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识)
- 文件结束标识 (2 bytes): 0xff, 0xd9 (EOI)

2.TGA
- 未压缩的前5字节    00 00 02 00 00
- RLE压缩的前5字节   00 00 10 00 00

3.PNG
- 文件头标识 (8 bytes)   89 50 4E 47 0D 0A 1A 0A

4.GIF
- 文件头标识 (6 bytes)   47 49 46 38 39(37) 61
                        G  I  F  8  9 (7)  a

5.BMP
- 文件头标识 (2 bytes)   42 4D
                        B  M

6.PCX
- 文件头标识 (1 bytes)   0A

7.TIFF
- 文件头标识 (2 bytes)   4D 4D 或 49 49

8.ICO
- 文件头标识 (8 bytes)   00 00 01 00 01 00 20 20

9.CUR
- 文件头标识 (8 bytes)   00 00 02 00 01 00 20 20

10.IFF
- 文件头标识 (4 bytes)   46 4F 52 4D
                        F  O  R  M

11.ANI
- 文件头标识 (4 bytes)   52 49 46 46
                        R  I  F  F

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值