美文网首页
iOS沙盒路径及文件操作

iOS沙盒路径及文件操作

作者: 冷暖自知灬 | 来源:发表于2023-10-31 09:29 被阅读0次

    前言

    开发中经常用到获取文件路径以及文件的操作,今天就来讨论一下路径和文件相关的东西。

    沙盒

    沙盒是苹果的安全机制,每个应用的数据都只能存到自己对应的沙盒中,应用不能访问别的应用的沙盒。沙盒中包含documents,tmp,app,Library。 1.png

    Documents :

    你应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。

    Library:

    这个目录下有两个子目录:Caches 和 Preferences

    Preferences:

    包含应用程序的偏好设置文件。你不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。

    Caches:

    用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。iTunes或iCloud不会对其进行备份。如果存储空间过低,可能会被系统删除。

    tmp:

    这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。系统会不定期删除里面的文件,iTunes或iCloud也不会对其进行备份

    SystemData

    新加的一个文件,具体的作用未知。

    AppName.app:

    这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。

    获取路径相关函数:
    // 获取沙盒主目录路径
    NSString *homeDir = NSHomeDirectory();
        
    // 获取Documents目录路径
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        
    // 获取Caches目录路径
    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        
    // 获取tmp目录路径
    NSString *tmpDir = NSTemporaryDirectory();
        
    // 获取当前程序包中一个图片资源(image.png)路径
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
    

    文件操作

    文件操作相关函数:
    -(NSData *)contentsAtPath:path  //从一个文件读取数据
    -(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据
    -(BOOL)removeItemAtPath:path error:err  //删除一个文件
    -(BOOL)moveItemAtPath:from toPath:to error:err  //重命名或者移动一个文件(to不能是已存在的)
    -(BOOL)copyItemAtPath:from toPath:to error:err  //复制文件(to不能是已存在的)
    -(BOOL)contentsEqualAtPath:path andPath:path2  //比较两个文件的内容
    -(BOOL)fileExistAtPath:path  //判断文件是否存在
    -(BOOL)isReadableFileAtPath:path  //判断文件是否存在,并且是否能执行读操作
    -(BOOL)isWriteableFileAtPath:path  //判断文件是否存在,并且是否能执行写操作
    -(NSDictionary *)attributesOfItemAtPath:path error:err  //获取文件的属性
    -(BOOL)setAttributesOfItemAtPath:attr error:err  //更改文件的属性
    
    /**使用目录**/
    -(NSString *)currentDirectoryPath  //获取当前目录
    -(BOOL)changeCurrentDirectoryPath:path  //更改当前目录
    -(BOOL)copyItemAtPath:from toPath:to error:err  //复制目录结构(to不能是已存在的)
    -(BOOL)createDirectoryAtPath:path withIntermediateDirectories:(BOOL)flag attribute:attr  //创建一个新目录
    -(BOOL)fileExistAtPath:path isDirectory:(BOOL*)flag  //测试文件是不是目录(flag中储存结果YES/NO)
    -(NSArray *)contentsOfDirectoryAtPath:path error:err  //列出目录内容
    -(NSDirectoryEnumerator *)enumeratorAtPath:path  //枚举目录的内容
    -(BOOL)removeItemAtPath:path error:err  //删除空目录
    -(BOOL)moveItemAtPath:from toPath:to error:err   //重命名或移动一个目录(to不能是已存在的)
    
    /**常用路径工具方法**/
    +(NSString *)pathWithComponens:components  //根据components中的元素构造有效路径
    -(NSArray *)pathComponents  //析构路径,获得组成此路径的各个部分
    -(NSString *)lastPathComponent  //提取路径的最后一个组成部分
    -(NSString *)pathExtension  //从路径的最后一个组成部分中提取其扩展名
    -(NSString *)stringByAppendingPathComponent:path  //将path添加到现有路径的末尾
    -(NSString *)stringByAppendingPathExtension:ext  //将指定的扩展名添加到路径的最后一个组成部分
    -(NSString *)stringByDeletingLastPathComponent  //删除路径的最后一个组成部分
    -(NSString *)stringByDeletingPathExtension  //从文件的最后一部分删除扩展名
    -(NSString *)stringByExpandingTileInPath   //将路径中代字符扩展成用户主目录(~)或指定用户的主目录(~user)
    -(NSString *)stringByresolvingSymlinksInPath  //尝试解析路径中的符号链接
    -(NSString *)stringByStandardizingPath  //通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径
    
    创建文件夹
    //创建文件夹
    
    - (void)createDir{
        
        NSString      *documentsPath    = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSFileManager *fileManager      = [NSFileManager defaultManager];
        NSString      *testDirectory    = [documentsPath stringByAppendingPathComponent:@"test"];
        // 创建目录
        BOOL res=[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
        if (res) {
            NSLog(@"文件夹创建成功");
        }else{
            NSLog(@"文件夹创建失败");
        }
    }
    
    创建文件
    //创建文件
    - (void)createFile{
        NSString      *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString      *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
        NSFileManager *fileManager   = [NSFileManager defaultManager];
        NSString      *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
        
        BOOL res = [fileManager createFileAtPath:testPath contents:nil attributes:nil];
        if (res) {
            NSLog(@"文件创建成功: %@" ,testPath);
        }else{
            NSLog(@"文件创建失败");
        }  
    }
    
    写数据到文件
    //写文件
    - (void)writeFile{
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
        NSString *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
        NSString *content       = @"测试写入内容!";
        BOOL res = [content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
        if (res) {
            NSLog(@"文件写入成功");
        }else{
            NSLog(@"文件写入失败");
        }
        
    }
    
    读取文件数据
    //读文件
    - (void)readFile{
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
        NSString *testPath      = [testDirectory stringByAppendingPathComponent:@"test.txt"];
        NSString *content       = [NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"文件读取成功: %@",content);
    }
    
    删除文件
    //删除文件
    - (void)deleteFile{
        NSString    *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString    *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString         *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
        BOOL res=[fileManager removeItemAtPath:testPath error:nil];
        if (res) {
            NSLog(@"文件删除成功");
        }else{
            NSLog(@"文件删除失败");
        }
        NSLog(@"文件是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO");
    }
    
    获取某个路径下所有文件名
    - (void)getAllName{
        NSString      *documentsPath    = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSFileManager *fileManager      = [NSFileManager defaultManager];
        NSString      *testDirectory    = [documentsPath stringByAppendingPathComponent:@"test"];
        //取得一个目录下得所有文件名
        NSArray *files = [fileManager subpathsAtPath:testDirectory];
    }
    

    相关文章

      网友评论

          本文标题:iOS沙盒路径及文件操作

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