IOS沙盒(sandbox)机制和文件操做(三)

咱们看看NSFileManager如何使用。包括建立文件,目录,删除,遍历目录等。git

 

一、在Documents里建立目录github

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

  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];  

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

二、在test目录下建立文件

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

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

实现代码以下:blog

  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了rem

三、获取目录列里全部文件名字符串

两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPathget

  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"

)

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

四、fileManager使用操做当前目录

  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目录更改到当前操做目录时,作文件读写就很方便了,不用加上全路径

五、删除文件

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

  1. [fileManager removeItemAtPath:fileName error:nil];  
六、混合数据的读写

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

6.1写入数据:
  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读取刚才写入的数据:

  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]算长度是,把中文算成一位了,出来的结果有误。

例子代码:https://github.com/schelling/YcDemo

相关文章
相关标签/搜索