美文网首页
iOS 沙盒&NSFileManager

iOS 沙盒&NSFileManager

作者: 草原烈鹰 | 来源:发表于2017-04-26 15:12 被阅读9次
    创建文件夹、创建文件、文件夹里面创建文件

    项目中常用的NSUserDefaults存放的地址是:Library/Preferences;
    通常用fileManager写入的例如页面缓存等存放地址是:Library/Caches。

    NSUserDefaults直接写入后,是默认存放的plist文件(registerDefaults方法除外,它没有写入plist)。

    fileManager写入:

    1. 先创建路径(也就文件夹路径):
            NSFileManager *fileM = [NSFileManager defaultManager];
            NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"wgj01"];
            if (![fileM fileExistsAtPath:documentsPath]) { 
                [fileM createDirectoryAtPath:documentsPath withIntermediateDirectories:YES attributes:nil error:nil];
            }
    
    2. 写入方式一:
            NSString *filePath = [documentsPath stringByAppendingPathComponent:@"w"];
            NSDictionary *dict = @{@"w":@"wwww"};
            [dict writeToFile:filePath atomically:YES];
    这样写入之后,在NSCachesDirectory里面的wgj01文件夹中有一个w文件,因为没有后缀,所以存放格式为xml格式。
    
    3. 写入方式二:
            NSString *filePath = [documentsPath stringByAppendingPathComponent:@"ws.plist"];
            NSDictionary *dict = @{@"w":@"wwww"};
            [dict writeToFile:filePath atomically:YES];
    文件ws有后缀,写入的是plist格式。
    
    3.1 针对3 的读取&修改方式:
         //读取:
          NSString *filePath = [documentsPath   stringByAppendingPathComponent:@"ws.plist"];
          NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
             NSLog(@"\n\n\n%@",dataDict);
         //修改或添加:
            [dataDict setObject:@"mmmmm" forKey:@"m"];
            [dataDict writeToFile:filePath atomically:YES];
    
    3.2   对于项目文件中的plist文件:
          NSString *filePath = [[NSBundle mainBundle] pathForResource:@"wgjTT" ofType:@"plist"];
         和沙盒里面的plist文件(上面3.1)一样,对解析出来的字典或者数组进行增删改等操作,
    但是,操作后,点击查看plist文件,发现没有变化,而,打印:
            NSMutableDictionary *dataDictafter = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath1];
            NSLog(@"\n\n\nTT0:\ndataDictafter:\n%@",dataDictafter);
    发现,打印结果时改变后的结果。
    
    猜测:应该是只写入了缓存,等程序重新运行,打印plist数据结果还是修改前的结果(plist并未有实质性的改变)。
    
    4. 写入方式三:
            NSString *filePath = [documentsPath stringByAppendingPathComponent:@"wh"];
            NSDictionary *dict = @{@"w":@"wwww"};
            NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
            [fileM createFileAtPath:filePath contents:data attributes:nil];
    这样,在wgj01文件夹下有一个wh文件,它里面的格式为:json格式。
    eg.
    {
      "w" : "wwww"
    }
    
    4.1 针对4的读出方式:
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"wh"];
     NSData *data =  [NSData dataWithContentsOfFile:filePath];
     NSDictionary *object11 = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
            NSLog(@"\n\n\n%@",object11); //读取成功
    
    5. 若想要继续创建文件夹,用stringByAppendingPathComponent后面拼接文件夹名称 并且 用        if (![fileM fileExistsAtPath:documentsPath]) {
                [fileM createDirectoryAtPath:documentsPath withIntermediateDirectories:YES attributes:nil error:nil];
            }创建文件夹。
    

    沙盒路径各目录用途:

    Documents 目录:您应该将所有de应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
    
    AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
    
    Library 目录:这个目录下有两个子目录:Caches 和 Preferences
    
    Library/Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.
    
    Library/Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
    
    tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。
    

    沙盒路径地址的获取:

    1,获取家目录路径的函数:  
    NSString *homeDir = NSHomeDirectory();  
    2,获取Documents目录路径的方法:  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    NSString *docDir = [paths objectAtIndex:0];  
    3,获取Caches目录路径的方法:  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
    NSString *cachesDir = [paths objectAtIndex:0];  
    4,获取tmp目录路径的方法:  
    NSString *tmpDir = NSTemporaryDirectory();  
    5,获取应用程序程序包中资源文件路径的方法:  
    例如获取程序包中一个图片资源(apple.png)路径的方法:  
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];  
    UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];  
    代码中的mainBundle类方法用于返回一个代表应用程序包的对象。
    

    e.g.

    NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSLog(@"目录:%@",Path);
        
        NSString *dataStr1 = @"testdata";
        NSString *dataStr2 = @"wgjwgj";
        NSString *dataStr3 = @"umeng";
        
        NSData *data1 = [dataStr1 dataUsingEncoding:NSUTF8StringEncoding];
        NSData *data2 = [dataStr2 dataUsingEncoding:NSUTF8StringEncoding];
        NSData *data3 = [dataStr3 dataUsingEncoding:NSUTF8StringEncoding];
        
        NSString *path1 = [Path stringByAppendingPathComponent:@"wgjTest1"];
        NSString *path2 = [Path stringByAppendingPathComponent:@"wgjTest2"];
        
        NSString *path4 = [Path stringByAppendingPathComponent:@"wgjjm"];
        
        NSFileManager *fileManager1 = [NSFileManager defaultManager];
        //创建文件夹
        [fileManager1 createDirectoryAtPath:path4 withIntermediateDirectories:YES attributes:nil error:nil];
        //创建文件
        [fileManager1 createFileAtPath:path1 contents:data1 attributes:nil];
        [fileManager1 createFileAtPath:path2 contents:data2 attributes:nil];
        //文件夹里面创建文件
        NSString *path5 = [path4 stringByAppendingPathComponent:@"wgj5"];
        [fileManager1 createFileAtPath:path5 contents:data3 attributes:nil];
        
        NSURL *url = [NSURL fileURLWithPath:Path isDirectory:YES];
        //遍历url这个相应的目录下的文件和文件夹以及文件夹中的文件,得出文件夹/文件目录,和文件大小
        NSDirectoryEnumerator *fileEnumerator = [fileManager1 enumeratorAtURL:url
                                                   includingPropertiesForKeys:@[NSFileSize]
                                                                      options:NSDirectoryEnumerationSkipsHiddenFiles
                                                                 errorHandler:NULL];
        NSUInteger fileCount = 0;
        NSUInteger totalSize = 0;
        for (NSURL *fileURL in fileEnumerator) {
            NSNumber *fileSize;
            [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL];
            totalSize += fileSize.unsignedIntegerValue;
            fileCount += 1;
        }
    

    相关文章

      网友评论

          本文标题:iOS 沙盒&NSFileManager

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