iOS文件管理

来源:互联网 发布:美国研究生预科 知乎 编辑:程序博客网 时间:2024/05/21 17:48

IOS中的沙盒机制(SandBox)是一种安全体系,

它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。

所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。

1.每个应用程序都在自己的沙盒内

2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容

3.应用程序向外请求或接收数据都需要经过权限认证

沙盒中内容

一个应用程序包: xxx.app

三个文件夹

Documents: 程序应用过程创建的文件/设置/小文件(iTunes会备份/iCloud会备份)

Library: 使用过程中从网络中下载的图片/音频/视频文件 (iTunes不会备份/iCloud不会备份)

tmp: 临时文件夹(系统会定时不定时的清除下面所有的文件)


获取沙盒根目录

    NSString *homeDirectory =NSHomeDirectory();


获取沙盒中的Documents目录

   /**第一个参数:制定要搜索的文件夹

    第二个参数:制定域(登录用户)

    第三个参数:YES(绝对路径);NO(~/xxx/xxx)

     */

    //获取数据中的唯一对象

    NSString *documentStr = 

    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)firstObject];


获取沙盒中的Library目录

    NSString *libraryStr = 

    [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];


获取沙盒中的Library/Caches目录(下载图片)

    NSString *cachesStr = 

    [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];


获取沙盒中的tmp目录

    NSString *tmpStr =NSTemporaryDirectory();


使用writeToFile方法,将NSString对象写入文件

    /*

     第二个参数:YES(默认在中间的过程中创建辅助文件,等待辅助文件中的内容写成功,然后写入test.txt)NO(没有辅助文件)

     第三参数:制定编码方式 UTF-8

     执行两个动作:1)判定test.txt是否存在,如果不存在,会自动地创建;2)如果存在,会将contentStr写入文件中,覆盖原来的内容

     */

    NSError *error = nil;

    BOOL isSuccess = 

    [contentStr writeToFile:filePathatomically:YESencoding:NSUTF8StringEncodingerror:&error];

    if (!isSuccess) {

        NSLog(@"写入字符串失败:%@",error.userInfo);

    }


NSArray对象写入文件

    [array writeToFile:filePathatomically:YES];


初始化文件管理对象

    self.fileMgr = [NSFileManager defaultManager]; //单例对象


创建文件夹

    /*

     第二个参数:yes(允许test文件已经存在,不再创建); no(不允许test文件夹存在;如果存在test文件夹,就会报错)

     第三个参数:制定文件的参数(文件夹的所有者/文件夹的权限rw); nil(使用默认的权限)

     */

    NSError *error = nil;

    [self.fileMgr createDirectoryAtPath:self.testDirectoryPathwithIntermediateDirectories:YESattributes:nilerror:&error];


创建文件,将NSString对象写入文件

    BOOL isSuccess = 

[self.fileMgr createFileAtPath:firstTestPathcontents:[firstStrdataUsingEncoding:NSUTF8StringEncoding]attributes:nil];


获取文件夹下的所有文件

方式一:

    NSError *error = nil;

    NSArray *filesArray = 

    [self.fileMgr subpathsOfDirectoryAtPath:self.testDirectoryPatherror:&error];

    if (!error) {

        for (NSString *fileStr in filesArray) {

            NSLog(@"file string:%@",fileStr);

        }

    }   

方式二:使用迭代器的方法获取test文件夹下的所有文件路径

    NSDirectoryEnumerator *enumeator = [self.fileMgrenumeratorAtPath:self.testDirectoryPath];

    NSString *obj;

    while (obj = [ enumeatornextObject]) {

        NSLog(@"文件的名字:%@", obj);

    }


拷贝文件

     /*

     1.首先判定targetFile是否存在,不存在,自动地创建;

            2.拷贝内容

     */

    NSError *error = nil;

    BOOL isSuccess = 

    [self.fileMgr copyItemAtPath:souceFiletoPath:targetFileerror:&error];


删除文件

    NSError *error = nil;

    BOOL isSuccess = 

    [self.fileMgr removeItemAtPath:testStrerror:&error];


查看Bundle容器文件路径

Bundle简单地讲,就是一个内部结构按照标准规则组织的特殊目录。

//SandBox: Bundle容器(xxx.app)

NSString *pngStr = 

    [[NSBundle mainBundle]pathForResource:@"test"ofType:@"png”];//test.png


使用NSFileHandle拷贝小文件

    //创建两个文件句柄的对象;源文件是读句柄,目标文件是写句柄

    NSFileHandle *readFileHandle = [NSFileHandlefileHandleForReadingAtPath:sourcePath];

    NSFileHandle *writeFileHandle = [NSFileHandlefileHandleForWritingAtPath:targetPath];

    //使用读句柄把源文件的内容读出来

    NSData *readData = [readFileHandlereadDataToEndOfFile];

    //使用写句柄将读出来的内容写入目标文件

    [writeFileHandlewriteData:readData];

    //关闭两个句柄对象

    [readFileHandle closeFile];

    [writeFileHandle closeFile];


使用NSFileHandle拷贝大文件

    //Documents/BigFile.pdf -> /Documents/BigFileBak.pdf

    NSString *sourcePath = [self.documentPath stringByAppendingPathComponent:@"Xcode_Overview.pdf"];

    NSString *targetPath = [self.documentPath stringByAppendingPathComponent:@"Xcode_Overview.bak”];//.bak文件是备份文件

    //创建一个空的目标文件BigFileBak.pdf

    [self.fileMgr createFileAtPath:targetPath contents:nil attributes:nil])

    //创建两个句柄(/)

    NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath];

    NSFileHandle *writeHandle = [NSFileHandle fileHandleForWritingAtPath:targetPath];

    //循环从原文件中读取一部分数据(5000bytes),读一部分写入目标文件中

    //每次读取源文件5000bytes大小

    NSInteger sizePerTime = 5000;

    //目前为止读取源文件的数据大小

    NSInteger readSize = 0;

源文件的总大小(方式一)

    unsigned long long totalFileSize = [readHandleseekToEndOfFile];

    //将移动到最后的读句柄对象挪动到文件最开始位置

    [readHandle seekToFileOffset:0];

源文件的总大小(方式二:通过fileMgr对象获取源文件属性)

    NSDictionary *fileDic = [self.fileMgrattributesOfItemAtPath:sourcePatherror:nil];

    NSNumber *fileSize = [fileDicobjectForKey:NSFileSize];

    unsigned long long totalFileSize = [fileSize longLongValue];

    //判定while循环的条件

    BOOL isEnd = YES;

    while (isEnd) {

        //剩下的还没有读取的数据大小

        NSInteger leftSize = totalFileSize - readSize;

        NSData *data = nil;

        if (leftSize < sizePerTime) {

             //情况一:不足5000bytes

            data = [readHandle readDataToEndOfFile];

            isEnd = NO;

        } else {

            //情况二:每次读取5000bytes

           data = [readHandlereadDataOfLength:sizePerTime];

            //累加每次读取的数据的大小

            readSize += sizePerTime;

            //挪动指针(偏移量每次都从文件的开始挪动)

            [readHandle seekToFileOffset:readSize];

        }

       //写入目标文件

        [writeHandle writeData:data];

    }

    //关闭两个句柄对象

    [readHandle closeFile];

    [writeHandle closeFile];








0 0
原创粉丝点击