美文网首页
iOS 中级篇 - 《沙盒&目录操作&文件操作》

iOS 中级篇 - 《沙盒&目录操作&文件操作》

作者: baiwulong | 来源:发表于2018-03-27 11:37 被阅读32次

    .
    .

    1、沙盒


    每一个APP都有一个存储空间,就是沙盒。APP之间不能相互通信。

    iOS 沙盒机制简介
    沙盒也叫沙箱,英文standbox,其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。在沙盒机制下,每个程序之间的文件夹不能互相访问。iOS系统为了保证系统安全,采用了这种机制。
    iOS 应用程序在安装时,会创建属于自己的沙盒文件,应用程序不能直接访问其他应用程序的沙盒文件,当应用程序需要向外部请求或接收数据时,都需要经过权限认证,否则,无法获取到数据。

    应用程序中所有的非代码文件都保存在沙盒中,比如图片、声音、属性列表,sqlite数据库和文本文件等。

    下面是一个沙盒目录截图:

    屏幕快照 2018-03-27 上午10.34.20.png

    目录文件介绍

    (1)沙盒路径:APP的私有存储空间。

    NSString*homeDir = NSHomeDirectory(); //输出的是沙盒的路径,里面包括Documents,Library等子目录。
    
    

    (2)Documents目录:此文件夹是默认备份的,备份到iCloud。

    // 获取Documents目录路径
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    /*
     此文件夹是默认备份的,备份到iCloud
    注:iCloud的备份,会通过Wi-Fi每天自动备份用户iOS设备。
    1.app的home目录下的所有东西都会被备份,除了应用Bundle本身、缓存目录和temp目录。
    2.已购买的音乐、应用、书籍、Camera Roll、设备设置、主屏幕、App组织、消息、铃声也都会被备份。
    3.由于备份通过无线进行,并且为每个用户存储在iCloud中,应用需最小化自己存储的数据数量。
    4.大文件会延长备份时间,并且消耗用户的可用iCloud空间。
    */
    

    (3)Library目录

    // 获取Library的目录路径
     NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
    
    

    (3-1)获取Library - Caches

    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    /*
    缓存数据
    可以重新下载或生成的数据,而且没有这些数据也不会妨碍用户离线使用应用的功能。
    缓存数据应该保存在/Library/Caches目录下。
    缓存数据在设备低存储空间时可能会被删除,iTunes或iCloud不会对其进行备份。
    系统的缓存都放在这个文件夹下面(主要是网路).
    当访问网络时系统自动会把访问的url,以数据库的方式存放在此目录下面.
    */
    
    

    (3-2)获取Library - Preferences(默认备份的)

    // 获取Preferences目录路径
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
     NSString *preferences = [[paths firstObject] stringByAppendingString:@"/Preferences"];
    /*
      NSUserDefaults就是默认存放在此文件夹
    */
    

    (4)获取tmp目录:临时文件夹(系统会不定期删除里面的文件)

    NSString *tmpDir = NSTemporaryDirectory();// 获取tmp目录路径
    /*
    应用需要写到本地存储,内部使用的临时数据,但不需要长期保留使用。
    临时数据应该保存在/tmp目录。
    系统可能会清空该目录下的数据,iTunes或iCloud也不会对其进行备份。
    应用在不需要使用这些数据时,应该尽快地删除临时数据,以避免浪费用户的存储空间。
    */
    
    

    .
    .

    2、文件操作相关


    2-1、 NSString类路径处理

    举例:NSString *path = @"/Uesrs/apple/testfile.txt"

    各个路径组成部分 : ("/","User","apple","testfile.txt")

    -(NSArray *)pathComponents;

    最后一个组成部分 : testfile.txt

    -(NSString *)lastPathComponent;

    删除最后一部分的组成路径 : /Users/apple

    -(NSString *)stringByDeletingLastPathCpmponent;

    将path添加到前面路径的末尾 : /Users/apple/testfile.txt/app.txt

    -(NSString *)stringByAppendingPathConmponent:(NSString *)path;

    取路径最后部分的扩展名 : txt

    -(NSString *)pathExtension;

    删除扩展名的部分路径 : /Users/apple/testfile

    -(NSString *)stringByDeletingPathExtension;

    路径最后部分追加扩展名 : /User/apple/testfile.txt.jpg

    -(NSString *)stringByAppendingPathExtension:(NSString *)str;

    2-2、文件管理

    NSFileManager * fileManager = [NSFileManager defaultManager]; //文件管理操作类
    
    遍历目录:浅度遍历 & 深度遍历
    //浅度遍历
    NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error];
    //深度遍历
     array = [fileManger subpathsOfDirectoryAtPath:path error:nil];
    
    判断文件是否存在
      BOOL isExist = [ [NSFileManager defaultManager] fileExistsAtPath:path];
    
    创建文件和目录
    /*
    创建文件 
    注意:如果文件已经存在会覆盖
    createFileAtPath:要创建文件的路径
    contents:文件内容(NSData类型)
    attributes:文件属性,一般为nil,nil表示采用默认属性。
    */
    - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
    
    /*
    创建目录
    createDirectoryAtPath:如果文件夹已经存在不会覆盖
    withIntermediateDirectories:是否有中间目录
    attributes:文件夹的属性,nil表示默认属性
    error:错误信息
    */
    BOOL createOK = [ [NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
    
    
    拷贝文件/目录
    //目录与目录拷贝
    [ [NSFileManager defaultManager] copyItemAtPath:fromFilePath toPath:toDirPath error:&error];
    
    //文件与文件拷贝
    [ [NSFileManager defaultManager] copyItemAtPath:fromFilePath toPath:toFilePath error:&error];
    
    
    移动文件/目录
    [[NSFileManager defaultManager] moveItemAtPath:frompath toPath:toPath error:nil];
    
    
    删除文件/目录
     [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
    
    
    获取文件属性
    NSDictionary *attributes = [fileManger attributesOfItemAtPath:path error:nil];
    NSLog(@"文件的属性:%@",attributes);
    
    

    .
    .

    2-3、NSFileHandle(文件句柄类)

    <1>打开文件方法
    //只读的句柄
    NSFileHandle *readOnlyHandle = [NSFileHandle fileHandleForReadingAtPath:path];
    //只写的句柄
    NSFileHandle *writeOnlyHandle  = [NSFileHandle fileHandleForWritingAtPath:path];
    
    //读写句柄
    NSFileHandle *readAndWriteHandle = [NSFileHandle fileHandleForUpdatingAtPath:path];
    
    <2>读指定长度的数据(单位为字节)
    //读取5个字节数据
    NSData *data = [readOnlyHandle readDataOfLength:5];
    
    <3>从当前偏移量读到文件尾
    [readOnlyHandle readDataToEndOfFile]
    [readAndWriteHandle readDataToEndOfFile]
    
    <4>设置文件偏移量(单位为字节)
    [readOnlyHandle seekToFileOffset:偏移的字节数];
    
    <5>将文件偏移量定位到文件尾
    [readOnlyHandle seekToEndOfFile];
    
    <6>写文件(不覆盖的时候需要设置偏移量)
    //1.先把偏移量指到文件尾部
    [readAndWriteHandle seekToEndOfFile];
    //2.写入到指定路径
    [readAndWriteHandle writeData:[@"abcdef" dataUsingEncoding:NSUTF8StringEncoding]];
    
    <7>关闭文件句柄
    //关闭文件句柄,关闭后(不需要)就不能再操作文件了
    [readAndWriteHandle closeFile];
    [readOnlyHandle closeFile];
    [writeOnlyHandle closeFile];
    

    参考文章:

    iOS之沙盒路径
    iOS开发-文件操作

    相关文章

      网友评论

          本文标题:iOS 中级篇 - 《沙盒&目录操作&文件操作》

          本文链接:https://www.haomeiwen.com/subject/kbsjcftx.html