iOS 应用程序在安装时,会创建属于自己的沙盒文件(standbox)。应用程序中所有的非代码文件都保存在沙盒中,如图片、声音、属性列表,sqlite数据库和文本文件等。 在沙盒机制下,每个应用程序之间的文件夹不能互相访问。iOS系统为了保证系统安全,采用了这种机制。 其原理是通过重定向技术,把应用程序生成和修改的文件,定向到自身文件夹中。

沙盒目录组成

沙盒的的根目录有三个文件夹:Documents,Library,tmp

子目录有Caches、Preferences等文件夹,其中 Documents 和 Preferences 会被 iCloud 同步。

值得注意的是, NSUserDefaults 是存储在 Preferences 下的文件,发现有很多开发者为了偷懒,频繁的使用 NSUserDefaults 做任意数据的磁盘缓存。 这是一个很不合理的做法,用处不大。且大量的数据一般缓存在 Caches 中。就算是从技术角度考虑, NSUserDefaults 是以 .plist 形式存储的,不适合大数据存储。

查找文件路径

NSSearchPathForDirectoriesInDomains() 是用来查找文件路径的函数。

返回值:是一个数组,其中只有一个 NSString 元素,即查找的路径。 参数1: NSDocumentDirectory 表示需要查找的目录 参数2: NSUserDomainMask 表示在用户的主目录中查找 参数3: YES 表示返回路径展开

  • 沙盒根目录的路径 通过 NSHomeDirectory() 获取沙盒路径。
  • NSString *path = NSHomeDirectory();
    NSLog(@"%@", path);
    
  • 获取Documents目录的路径 参数1是NSDocumentDirectory
  • NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMaskYES).lastObject;
    
  • 获取Library目录的路径 参数1是NSLibraryDirectory
  • NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectoryNSUserDomainMaskYES).lastObject;
    
  • 获取Caches目录的路径 参数1是NSCachesDirectory
  •  NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectoryNSUserDomainMaskYES).lastObject;
    

    此目录用来保存应用程序运行时,生成的需要持久化的数据,这些数据一般存储体积较大,又不十分重要,如网络请求数据等。需要用户负责删除。

  • 获取Preferences目录的路径
  • NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectoryNSUserDomainMaskYES).lastObject stringByAppendingPathComponent:@"Preferences"];
    

    此目录保存应用程序的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。

  • 获取tmp文件路径
  • NSString *path = NSTemporaryDirectory();
    

    此目录保存应用程序运行时,所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。

    ###保存图片到沙盒

        UIImage *currentImage  = photos[i];
        NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
       // 获取沙盒路径
        NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:[NSString stringWithFormat:@"%zd.png",i]];
        // 写入
        [imageData writeToFile:fullPath atomically:YES];   
    

    从沙盒读取图片

    // 读取图片
    NSString * fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Docments"] stringByAppendingPathComponent:@"currentImage.png"];
    UIImage * savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];
    

    删除沙盒文件

    -(void)deleteFile {
        NSFileManager * fileManager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        //文件名
        NSString *uniquePath=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"pin.png"];
        BOOL isExit =[[NSFileManager defaultManager] fileExistsAtPath:uniquePath];
        if (! isExit) {
            NSLog(@"not exit !");
            return ;
        }else {
            BOOL isDele= [fileManager removeItemAtPath:uniquePath error:nil];
            if (isDele) 
                NSLog(@"delete success");
    

    得到沙盒中的所有文件

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *document=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *folder =[document stringByAppendingPathComponent:@"folder"];
        NSArray *fileList ;
        fileList =[fileManager contentsOfDirectoryAtPath:folder error:NULL];
        for (NSString *file in fileList) {
            NSLog(@"file=%@",file);
            NSString *path =[folder stringByAppendingPathComponent:file];
            NSLog(@"得到的路径=%@",path);
    

    计算文件大小

    - (long long)fileSizeAtPath:(NSString *)path
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:path])
            long long size = [fileManager attributesOfItemAtPath:path error:nil].fileSize;
            return size;
        return 0;
    

    文件夹大小

    - (long long)folderSizeAtPath:(NSString *)path
        NSFileManager *fileManager = [NSFileManager defaultManager];
        long long folderSize = 0;
        if ([fileManager fileExistsAtPath:path])
            NSArray *childerFiles = [fileManager subpathsAtPath:path];
            for (NSString *fileName in childerFiles)
                NSString *fileAbsolutePath = [path stringByAppendingPathComponent:fileName];
                if ([fileManager fileExistsAtPath:fileAbsolutePath])
                    long long size = [fileManager attributesOfItemAtPath:fileAbsolutePath error:nil].fileSize;
                    folderSize += size;
        return folderSize;
    

    www.jianshu.com/p/0913b8b6c… www.jianshu.com/p/0dbe875d7… www.jianshu.com/p/dd3f120eb…

    分类:
    iOS
    标签: