iOS文件操作

作者: 伊人半笑 | 来源:发表于2017-07-23 20:06 被阅读130次

    一、获取沙盒下文件目录

    沙盒应用根目录:NSHomeDirectory()是应用程序目录的路径,在改文件目录下有三个文件夹:Documents、Library、temp以及一个.app包

    NSString *homeDir = NSHomeDirectory();
    

    应用程序包:存放应用程序的源文件,包括资源文件和可执行文件

    [[NSBundle mainBundle] pathForResource:@"wtdb" ofType:@"sqlite"];
    

    Documents:保存用户生成的文件、应用程序不能重新创建的文件。可被iTunes备份

    // 获取Documents目录路径
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    

    Library:可创建子文件夹。除Caches以外,都会被iTunes备份
    /Preferences:包含应用程序的偏好设置文件
    /Caches:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息,保存可以重新下载或者重新生成的数据。适合存储体积大,不需要备份的非重要数据

    // 获取Library的目录路径
    NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    
    // 获取Caches目录路径
    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    
    

    tmp:存放临时数据,保存应用程序再次启动过程中不需要的信息。不会被iTunes备份

    // 获取tmp目录路径
    NSString *tmpDir =  NSTemporaryDirectory();
    

    关于iOS Data Storage Guidelines,参考iOS Data Storage Guidelines - Apple Developer

    • Documents和Caches文件夹区别

      如果你做个记事本的app,那么用户写了东西,总要把东西存起来。那么这个文件则是用户自行生成的,就放在documents文件夹里面。
      如果需要和服务器配合,经常从服务器下载东西,展示给用户看。那么这些下载下来的东西就放在library/caches。

    二、文件夹操作

    创建文件夹

    NSString *documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    //test文件夹
    documentsDir = [documentsDir stringByAppendingPathComponent:@"test"];
    //是否是文件夹
    BOOL isDir;
    BOOL isExit = [filemanager fileExistsAtPath:documentsDir isDirectory:&isDir];
    //文件夹是否存在
    if (!isExit || !isDir) {
        [filemanager createDirectoryAtPath:documentsDir withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    

    删除文件夹

    //删除Wtdb文件夹
    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *wtdbPath = [cachesDir stringByAppendingPathComponent:@"Wtdb"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:wtdbPath]) {
        BOOL isSuccess = [fileManager removeItemAtPath:wtdbPath error:nil];
    }
    

    移动文件夹

    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
    NSString *moveToPath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
    BOOL isSuccess = [fileManager moveItemAtPath:filePath toPath:moveToPath error:nil];
    if (isSuccess) {
        NSLog(@"rename success");
    }else{
        NSLog(@"rename fail");
    }
    

    重命名文件夹

    //通过移动该文件对文件重命名
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"iOS.txt"];
    NSString *moveToPath = [documentsPath stringByAppendingPathComponent:@"rename.txt"];
    BOOL isSuccess = [fileManager moveItemAtPath:filePath toPath:moveToPath error:nil];
    if (isSuccess) {
        NSLog(@"rename success");
    }else{
        NSLog(@"rename fail");
    }
    

    三、文件操作

    复制

    //bundle里的数据库文件复制到Caches/Wtdb文件夹下
    NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSFileManager *filemanager = [NSFileManager defaultManager];
    cachesDir = [cachesDir stringByAppendingPathComponent:@"Wtdb"];
    BOOL isDir;//是否是文件夹
    BOOL exit = [filemanager fileExistsAtPath:cachesDir isDirectory:&isDir];
    //文件夹是否存在
    if (!exit || !isDir) {
        [filemanager createDirectoryAtPath:cachesDir withIntermediateDirectories:YES attributes:nil error:nil];
    }
    //判断数据库文件是否存在
    NSString *wtdbPath = [cachesDir stringByAppendingPathComponent:@"wtdb.sqlite"];
    //如果文件不存在,则复制
    if (![filemanager fileExistsAtPath:wtdbPath]) {
        NSString *dbBundlePath = [[NSBundle mainBundle] pathForResource:@"wtdb" ofType:@"sqlite"];
        BOOL isSuccess = [filemanager copyItemAtPath:dbBundlePath toPath:wtdbPath error:nil];
        DLog(@"数据库文件%@", isSuccess ? @"拷贝成功" : @"拷贝失败");
    }
    
    • 删除、移动、重命名与文件夹操作类似,path为文件路径。

    写数据到文件

    NSString *documentsPath =[self dirDoc];  
    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(@"文件写入失败");  
    }
    

    读文件数据

    NSString *documentsPath =[self dirDoc];  
    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];  
    //NSData *data = [NSData dataWithContentsOfFile:testPath];  
    //NSLog(@"文件读取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);  
    NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];  
    NSLog(@"文件读取成功: %@",content);  
    

    文件属性

    NSString *documentsPath =[self dirDoc];  
    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
    NSFileManager *fileManager = [NSFileManager defaultManager];  
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];  
    NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:testPath error:nil];     
    NSArray *keys;  
    id key, value;  
    keys = [fileAttributes allKeys];  
    int count = [keys count];  
    for (int i = 0; i < count; i++)  
    {  
        key = [keys objectAtIndex: i];  
        value = [fileAttributes objectForKey: key];  
        NSLog (@"Key: %@ for value: %@", key, value);  
    } 
    

    参考:

    1. http://www.cnblogs.com/iOS-mt/p/4185407.html
    2. http://www.superqq.com/blog/2015/07/24/nsfilemanagerwen-jian-cao-zuo-de-shi-ge-xiao-gong-neng/
    3. http://www.itdadao.com/articles/c15a663369p0.html

    相关文章

      网友评论

        本文标题:iOS文件操作

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