zoukankan      html  css  js  c++  java
  • iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)

    1、在Documents里创建目录

    创建一个叫test的目录,先找到Documents的目录,

     

    [cpp] view plaincopy
     
     
    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
    2.    NSString *documentsDirectory = [paths objectAtIndex:0];    
    3.    NSLog(@"documentsDirectory%@",documentsDirectory);    
    4.    NSFileManager *fileManager = [NSFileManager defaultManager];    
    5.    NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
    6.    // 创建目录  
    7.    [fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];  

    启动程序,这时候目录就创建了:

     

    2、在test目录下创建文件

    创建文件怎么办呢?接着上面的代码 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。这样才能在test下写入文件。

     

    testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test00.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。

    实现代码如下:

     

    [cpp] view plaincopy
     
     
    1. NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];    
    2. NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"];    
    3. NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"];    
    4.   
    5.   
    6. NSString *string = @"写入内容,write String";  
    7. [fileManager createFileAtPath:testPath contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
    8. [fileManager createFileAtPath:testPath2 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  
    9. [fileManager createFileAtPath:testPath3 contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];  

    看下面的图,三个文件都出来了,内容也对。

    在Documents目录下创建就更简单了,不用加test就ok了

    3、获取目录列里所有文件名

    两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPath

    [cpp] view plaincopy
     
     
    1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    
    2. NSString *documentsDirectory = [paths objectAtIndex:0];    
    3. NSLog(@"documentsDirectory%@",documentsDirectory);    
    4. NSFileManager *fileManage = [NSFileManager defaultManager];    
    5. NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];    
    6. NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];   
    7. NSLog(@"%@",file);    
    8. NSArray *files = [fileManage subpathsAtPath: myDirectory ];   
    9. NSLog(@"%@",files);  

    获取上面刚才test文件夹里的文件名

    打印结果

    2012-06-17 23:23:19.684 IosSandbox[947:f803] fileList:(

        ".DS_Store",

        "test00.txt",

        "test22.txt",

        "test33.txt"

    )

    2012-06-17 23:23:19.686 IosSandbox[947:f803] fileLit(

        ".DS_Store",

        "test00.txt",

        "test22.txt",

        "test33.txt"

    )

    两个方法都可以,隐藏的文件也打印出来了。

    4、fileManager使用操作当前目录

     

    [cpp] view plaincopy
     
     
    1. //创建文件管理器  
    2.     NSFileManager *fileManager = [NSFileManager defaultManager];  
    3.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    4.     NSString *documentsDirectory = [paths objectAtIndex:0];  
    5.     //更改到待操作的目录下  
    6.     [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];  
    7.     //创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil  
    8.     NSString * fileName = @"testFileNSFileManager.txt";  
    9.     NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];  
    10.     [fileManager createFileAtPath:fileName contents:array attributes:nil];  

    这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了

     

    changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径

    5、删除文件

    接上面的代码,remove就ok了。

     

    [cpp] view plaincopy
     
     
    1. [fileManager removeItemAtPath:fileName error:nil];  

    6、混合数据的读写

     

    用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来

    6.1写入数据:

     

    [cpp] view plaincopy
     
     
    1. NSString * fileName = @"testFileNSFileManager.txt";  
    2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
    3. NSString *documentsDirectory = [paths objectAtIndex:0];  
    4. //获取文件路径  
    5. NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];  
    6. //待写入的数据  
    7. NSString *temp = @"nihao 世界";  
    8. int dataInt = 1234;  
    9. float dataFloat = 3.14f;  
    10. //创建数据缓冲  
    11. NSMutableData *writer = [[NSMutableData alloc] init];  
    12. //将字符串添加到缓冲中  
    13. [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];     
    14. //将其他数据添加到缓冲中  
    15. [writer appendBytes:&dataInt length:sizeof(dataInt)];  
    16. [writer appendBytes:&dataFloat length:sizeof(dataFloat)];    
    17. //将缓冲的数据写入到文件中  
    18. [writer writeToFile:path atomically:YES];  


    我们看看数据怎么样了:


    我们看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制

    6.2读取刚才写入的数据:

     

    [cpp] view plaincopy
     
     
    1. //读取数据:  
    2.    int intData;  
    3.    float floatData = 0.0;  
    4.    NSString *stringData;  
    5.      
    6.    NSData *reader = [NSData dataWithContentsOfFile:path];  
    7.    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]  
    8.                                   encoding:NSUTF8StringEncoding];  
    9.    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];  
    10.    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];  
    11.    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);  


    打印出来的结果:

     

    2012-06-17 23:51:14.723 IosSandbox[1285:f803] stringData:nihao hello! intData:1234332 floatData:3.140000

    这里把写入的汉字改成了 hello。因为[temp length]算长度是,把中文算成一位了,出来的结果有误。

  • 相关阅读:
    blender+threejs
    170112、solr从服务器配置整合到项目实战
    170111、MapperScannerConfigurer处理过程源码分析
    170110、Spring 事物机制总结
    170109、JSONP是什么
    170106、用9种办法解决 JS 闭包经典面试题之 for 循环取 i
    170105、MySQL 性能优化的最佳 20+ 条经验
    170104、js内置对象与原生对象
    170103、Redis官方集群方案 Redis Cluster
    161230、利用代理中间件实现大规模Redis集群
  • 原文地址:https://www.cnblogs.com/llios/p/3922020.html
Copyright © 2011-2022 走看看