iOS 沙盒&NSFileManager

2017-04-26  本文已影响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;
    }
上一篇下一篇

猜你喜欢

热点阅读