1 NSData和NSMutableData的基本使用

1.1 问题

NSData类是IOS提供的用于以二进制的形式操作文件数据的类,NSData有两个常用的属性length和bytes,length表示字节的数量,bytes起始字节的位置是一个指针类型,本案例演示NSData和NSMutableData的基本使用,使用NSData /NSMutableData对象保存一个C语言字符串。

1.2 方案

首先使用Xcode创建一个命令行项目,在main函数中创建一个NSData对象data,使用initWithBytes:length:方法进行初始化,将一个C语言字符串保存起来,bytes参数就是字符串的起始地址,length是字节长度,可以通过在控制台输出查看。

然后在main函数中创建一个NSMutableData对象mdata,可以使用initWithData:方法进行初始化,data是一个NSData类型的参数。

最后通过NSMutableData类提供的方法resetBytesInRange:、appendData:、replaceBytesInRange:withBytes:分别对mdata对象进行重置、拼接和替换修改等操作。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建NSData对象

首先在创建好的命令行项目中创建一个NSData对象,使用initWithBytes:length:方法进行初始化,本案例将一个C语言字符串保存起来,bytes参数就是字符串的起始地址,length是字节长度,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. char *s1 = "abc";
  4. //length参数传递的值为strlen(s1)+1,因为要保存C语言字符串末尾的\0
  5. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  6. }
  7. return 0;
  8. }

然后在控制台输出data对象的bytes和length属性,bytes属性使用%s占位符,length属性使用%lu占位符,代码如下所示:

  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. char *s1 = "abc";
  4. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  5. NSLog(@"%s,%lu",data.bytes,(unsigned long)data.length);
  6. }
  7. return 0;
  8. }

最后运行程序在控制台输出,可以看见控制台将字符串“abc”输出,字节长度是4个,如图-1所示:

图-1

步骤二:创建NSMutableData对象

首先在main函数中创建一个NSMutableData对象mdata,可以使用initWithData:方法进行初始化,data参数传递上一步创建好的data对象,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. char *s1 = "abc";
  4. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  5. NSLog(@"%s,%lu",data.bytes,(unsigned long)data.length);
  6. NSMutableData *mdata = [[NSMutableDataalloc]initWithData:data];
  7. NSLog(@"%s,%lu",mdata.bytes,mdata.length);
  8. }
  9. return 0;
  10. }

此时mdata对象保存的同样是“abc”字符串。然后使用NSMutableData类提供的方法resetBytesInRange:将mdata对象里面的数据全都置为零,使用appendData:方法将data对象拼接到mdata对象的末尾,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. char *s1 = "abc";
  4. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  5. NSLog(@"%s,%lu",data.bytes,(unsigned long)data.length);
  6. NSMutableData *mdata = [[NSMutableDataalloc]initWithData:data];
  7. NSLog(@"%s,%lu",mdata.bytes,mdata.length);
  8. NSRange range = {0,4};
  9. [mdataresetBytesInRange:range];
  10. [mdataappendData:data];
  11. }
  12. return 0;
  13. }

最后使用replaceBytesInRange:withBytes:将mdata对象的第0-4个字节的数据用字符串“1234”替换,代码如下所示:

  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. char *s1 = "abc";
  4. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  5. NSLog(@"%s,%lu",data.bytes,(unsigned long)data.length);
  6. NSMutableData *mdata = [[NSMutableDataalloc]initWithData:data];
  7. NSLog(@"%s,%lu",mdata.bytes,mdata.length);
  8. NSRange range = {0,4};
  9. [mdataresetBytesInRange:range];
  10. [mdataappendData:data];
  11. char *s2 = "1234";
  12. [mdatareplaceBytesInRange:range withBytes:s2];
  13. NSLog(@"%s",mdata.bytes);
  14. }
  15. return 0;
  16. }

运行程序在控制台输出,可以看见控制台将拼接的字符串“1234abc”输出,字节长度是8个,如图-2所示:

图-2

1.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. char *s1 = "abc";
  5. NSData *data = [[NSDataalloc]initWithBytes:s1length:strlen(s1)+1];
  6. NSLog(@"%s,%lu",data.bytes,(unsigned long)data.length);
  7. NSMutableData *mdata = [[NSMutableDataalloc]initWithData:data];
  8. NSLog(@"%s,%lu",mdata.bytes,mdata.length);
  9. NSRange range = {0,4};
  10. [mdataresetBytesInRange:range];
  11. [mdataappendData:data];
  12. char *s2 = "1234";
  13. [mdatareplaceBytesInRange:range withBytes:s2];
  14. NSLog(@"%s,%lu",mdata.bytes,mdata.length);
  15. }
  16. return 0;
  17. }

2 使用NSString和NSData读写文件

2.1 问题

NSString和NSData类可以相互转换。并且都可以通过writetoFile:方法直接写入文件,本案例使用NSString和NSData读写文件。

2.2 方案

首先使用Xcode创建一个命令行项目,在main函数中创建一个NSString类型的对象string,然后使用的方法writeToFile:atomically:encoding:将字符串直接写入文件,file参数是写入本地的文件路径,这里暂时使用电脑桌面路径(实际开发使用的应该是手机路径,后面课程会一一介绍),atomically参数设置为YES,encoding参数是字符串的编码格式,设置为最常用的编码格式UTF-8。

然后在通过stringWithContentsOfFile:encoding:error:方法从文件中读取字符串,编码格式要与写入文件时使用的编码格式保持一致。如果在不知道编码格式的情况下可以使用stringWithContentsOfFile:usedEncoding:error:方法猜出编码格式,猜出的编码格式会通过引用参数usedEncoding返回。

如果希望对NSString对象进行二进制的操作,那么就需要先将NSString对象转化为NSData对象,然后再使用NSData提供的写入文件的方法writeToFile:atomically:将NSString类型的对象存入文件。

最后在读取文件的时候可以使用NSData提供的的dataWithContentsOfFile:方法或者是initWithContentsOfFile:方法。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:NSString直接写入文件

首先在main函数中创建一个NSString类型的对象string,存储字符串“Hello world!”,然后使用的方法writeToFile:atomically:encoding:将字符串直接写入文件,file参数是写入本地的文件路径,这里暂时使用电脑桌面路径“/Users/Tarena/Desktop/hello.txt”,atomically参数设置为YES安全写入,encoding参数设置为NSUTF8StringEncoding,代码如下所示:

  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *string = @"Hello world!";
  4. [stringwriteToFile:@"/Users/Tarena/Desktop/hello.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
  5. }
  6. return 0;
  7. }

然后运行程序,电脑桌面会增加一个名为hello.txt的文件,文件内容就是字符串“Hello world!”如图-3所示:

图-3

最后通过stringWithContentsOfFile:encoding:error:方法从文件中读取字符串,编码格式要与写入文件时使用的编码格式保持一致,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *string = @"Hello world!";
  4. [stringwriteToFile:@"/Users/Tarena/Desktop/hello.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
  5. NSString *string1 = [NSStringstringWithContentsOfFile:@"/Users/Tarena/Desktop/hello.txt" encoding:NSUTF8StringEncoding error:nil];
  6. NSLog(@"string1:%@",string1);
  7. }
  8. return 0;
  9. }

如果在不知道编码格式的情况下可以使用stringWithContentsOfFile:usedEncoding:error:方法猜出编码格式,猜出的编码格式会通过引用参数usedEncoding返回,代码如下所示:

 
  1. int main(intargc, const char * argv[]) {
  2. @autoreleasepool {
  3. NSString *string = @"Hello world!";
  4. [stringwriteToFile:@"/Users/Tarena/Desktop/hello.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
  5. NSString *string1 = [NSStringstringWithContentsOfFile:@"/Users/Tarena/Desktop/hello.txt" encoding:NSUTF8StringEncoding error:nil];
  6. NSLog(@"string1:%@",string1);
  7. //在不知道编码信息的情况下可以通过此方法猜出编码
  8. NSStringEncodinguseEncoding;
  9. NSString *string2 = [NSStringstringWithContentsOfFile:@"/Users/Tarena/Desktop/hello.txt" usedEncoding:&useEncodingerror:nil];
  10. //useEncoding就是猜出的编码格式
  11. NSLog(@"string2:%@,%lu",string2,(unsigned long)useEncoding);
  12. }
  13. return 0;
  14. }

运行程序,读取的字符串仍然是“Hello world!”控制台输出的的useEncoding的值是4,查看对应的枚举值就是NSUTF8StringEncoding。

步骤二:将NSString转化为NSData写入文件

首先使用NSString提供的方法dataUsingEncoding:将string对象转化为NSData类型的对象data,然后再使用NSData提供的写入文件的方法writeToFile:atomically:将data对象写入文件,file参数就是文件的路径,代码如下所示:

  1. string = @"1234567890";
  2. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  3. [datawriteToFile:@"/Users/Tarena/Desktop/123.txt" atomically:YES];

运行程序,电脑桌面会增加一个名为123.txt的文件,文件内容就是字符串“1234567890”,如图-4所示:

图-4

最后使用NSData提供的的dataWithContentsOfFile:方法或者是initWithContentsOfFile:方法读取文件,代码如下所示:

  1. string1 = [[NSStringalloc]initWithData:data2 encoding:NSUTF8StringEncoding];
  2. NSLog(@"%@",string1);

运行程序,控制台输出的字符串是“1234567890“。

2.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[]) {
  3. @autoreleasepool {
  4. NSString *string = @"Hello world!";
  5. [stringwriteToFile:@"/Users/Tarena/Desktop/hello.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
  6. NSString *string1 = [NSStringstringWithContentsOfFile:@"/Users/Tarena/Desktop/hello.txt" encoding:NSUTF8StringEncoding error:nil];
  7. NSLog(@"string1:%@",string1);
  8. //在不知道编码信息的情况下可以通过此方法猜出编码
  9. NSStringEncodinguseEncoding;
  10. NSString *string2 = [NSStringstringWithContentsOfFile:@"/Users/Tarena/Desktop/hello.txt" usedEncoding:&useEncodingerror:nil];
  11. //useEncoding就是猜出的编码格式
  12. NSLog(@"string2:%@,%lu",string2,(unsigned long)useEncoding);
  13. string = @"1234567890";
  14. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  15. [datawriteToFile:@"/Users/Tarena/Desktop/123.txt" atomically:YES];
  16. NSData *data2 = [NSDatadataWithContentsOfFile:@"/Users/Tarena/Desktop/123.txt"];
  17. string1 = [[NSStringalloc]initWithData:data2 encoding:NSUTF8StringEncoding];
  18. NSLog(@"%@",string1);
  19. }
  20. return 0;
  21. }

3 文件路径的基本操作

3.1 问题

文件路径是一个NSString类型的字符串,以“/”开头代表根目录,本案例演示如何使用NSString类提供了几种常用的操作路径的方法。

3.2 方案

首先在main函数中创建一个NSString类型的对象path,用于存储一个路径@"/Users/tarena/Desktop"。

然后使用NSString提供的方法stringByAppendingPathComponent:对路径进行拼接,再使用pathComponents方法拆分路径。

最后使用NSString提供的方法进行添加文件扩展名、获取和删除文件名等其他操作。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建路径

首先在main函数中创建一个NSString类型的对象path,用于存储一个路径@"/Users/tarena/Desktop"。

然后使用NSString提供的方法stringByAppendingPathComponent:对路径进行拼接,代码如下所示:

 
  1. int main(intargc, const char * argv[])
  2. {
  3. @autoreleasepool {
  4. NSString * path = @"/Users/tarena/Desktop";
  5. // 拼出子文件夹/子文件路径,会自动补上/
  6. NSLog(@"%@", [path stringByAppendingPathComponent:@"xcode_5.dmg"]);
  7. }
  8. return 0;
  9. }

运行程序,控制台输出拼接好的路径,如图-5所示:

图-5

再使用pathComponents方法拆分路径,该方法会将组成路径的每个部分拆分开来,并且存储带一个数组中,该数组就是pathComponents方法的返回值,代码如下所示“

 
  1. int main(intargc, const char * argv[])
  2. {
  3. @autoreleasepool {
  4. // 1. 路径的组成
  5. NSString * path = @"/Users/apple/Desktop";
  6. // 2. 拼出子文件夹/子文件路径,自动补上/
  7. NSLog(@"%@", [path stringByAppendingPathComponent:@"xcode_5.dmg"]);
  8. // 3. 拆分一个路径的component
  9. NSArray * components = [path pathComponents];
  10. for (NSString * component in components) {
  11. NSLog(@"%@", component);
  12. }
  13. return 0;
  14. }

运行程序,控制台依次输出组成路径的每个文件夹和文件名,如图-6所示:

图-6

步骤二:关于路径的其他操作

使用stringByAppendingPathExtension:给文件名添加扩展名,代码如下所示:

  1. // 4. 追加文件扩张名,自动补上“.”
  2. NSString * path2 = @"/User/tarena/Desktop";
  3. path2 = [path2 stringByAppendingPathComponent:@"Elephant"];
  4. path2 = [path2 stringByAppendingPathExtension:@"jpg"];
  5. NSLog(@"%@", path2);

运行程序控制台输出的路径为“/User/tarena/Desktop/Elephant.jpg”。

使用pathExtension方法获取文件扩展名,代码如下所示:

  1. NSString * extension = [path2 pathExtension];
  2. NSLog(@"%@", extension);

使用lastPathComponent方法获取文件名,代码如下所示:

  1. NSString * component = [path2 lastPathComponent];
  2. NSLog(@"%@", component);

使用stringByDeletingLastPathComponent方法获取父文件夹路径,代码如下所示:

 
  1. NSString * path3 = [path2 stringByDeletingLastPathComponent];
  2. NSLog(@"%@", path3);

3.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. // 1. 路径的组成 /文件夹名/文件夹名/文件夹名/....../文件名
  6. NSString * path = @"/Users/tarena/Desktop";
  7. // 2. 拼出子文件夹/子文件路径,自动补上/
  8. NSLog(@"%@", [path stringByAppendingPathComponent:@"xcode_5.dmg"]);
  9. // 3. 拆分一个路径的component
  10. NSArray * components = [path pathComponents];
  11. for (NSString * component in components) {
  12. NSLog(@"%@", component);
  13. }
  14. // 4. 追加文件扩张名,自动补上“.”
  15. NSString * path2 = @"/User/tarena/Desktop";
  16. path2 = [path2 stringByAppendingPathComponent:@"Elephant"];
  17. path2 = [path2 stringByAppendingPathExtension:@"jpg"];
  18. NSLog(@"%@", path2);
  19. // 5. 获取文件后缀,用于判断文件类型(简单)
  20. NSString * extension = [path2 pathExtension];
  21. NSLog(@"%@", extension);
  22. // 6. 获取最后一个component,获取文件/文件夹的名字
  23. NSString * component = [path2 lastPathComponent];
  24. NSLog(@"%@", component);
  25. // 7. 删除最后一个component,返回上层文件夹/获取父文件夹路径
  26. NSString * path3 = [path2 stringByDeletingLastPathComponent];
  27. NSLog(@"%@", path3);
  28. }
  29. return 0;
  30. }

4 使用NSFileManager操作文件

4.1 问题

NSFileManager是IOS提供的对本地文件进行操作的类,例如创建目录、创建文件、遍历文件和文件夹、删除文件以及拷贝文件等,本案例演示使用NSFileManager对文件进行基本的操作。

4.2 方案

首先在main函数中通过defaultManager方法获取NSFileManager对象fileManager是一个单例对象,使用fileManager提供的方法createDirectoryAtPath:withIntermediateDirectories: attributes:error:在桌面创建一组文件夹,文件夹的层级关系如下:

首先有一个users文件夹;

users文件夹下有三个子文件夹分别为10000、10010、10086;

10000、10010、10086三个文件夹下分别又有四个子文件夹分别为images、cache、 download、history。

其次使用fileManager的方法createFileAtPath:contents:attributes:在images、cache、 download、history四个文件中创建文件,命名为data。如果是10086文件夹,则使用fileManager的方法removeItemAtPath:error:将data文件删除。

然后使用fileManager的方法contentsOfDirectoryAtPath:遍历刚才创建的users文件夹的内容,并且判断是否为文件夹。

最后fileManager的方法copyItemAtPath:toPath:将一张图片拷贝到电脑桌面。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建users文件夹

首先在main函数中通过defaultManager方法获取NSFileManager对象fileManager是一个单例对象,使用fileManager提供的方法createDirectoryAtPath:withIntermediateDirectories: attributes:error:在桌面创建一组文件夹users,代码如下所示:

 
  1. int main(intargc, const char * argv[])
  2. {
  3. @autoreleasepool {
  4. //获取fileManager
  5. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  6. //创建文件和文件夹
  7. NSString * rootPath = @"/Users/Tarena/Desktop";
  8. NSString * usersFolder = @"users";
  9. NSArray * users = @[@"10086", @"10010", @"10000"];
  10. NSArray * folders = @[@"images", @"cache", @"download", @"history"];
  11. NSString * usersPath = [rootPathstringByAppendingPathComponent:usersFolder];
  12. for (NSString * user in users){
  13. for (NSString * folder in folders) {
  14. NSString * folderPath = nil;
  15. folderPath = [usersPathstringByAppendingPathComponent:user];
  16. folderPath = [folderPathstringByAppendingPathComponent:folder];
  17. //创建目录创建文件夹,withIntermediateDirectories是否顺便创建中间没有创建的文件夹
  18. [fileManagercreateDirectoryAtPath:folderPathwithIntermediateDirectories:YESattributes:nilerror:nil];
  19. }
  20. }
  21. }
  22. return 0;
  23. }

运行程序,可见桌面上增加一个文件夹users,如图-7所示:

图-7

步骤二:创建data文件

首先使用fileManager的方法createFileAtPath:contents:attributes:在images、cache、 download、history四个文件中创建文件,命名为data,代码如下所示:

 
  1. int main(intargc, const char * argv[])
  2. {
  3. @autoreleasepool {
  4. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  5. //创建文件和文件夹
  6. NSString * rootPath = @"/Users/Tarena/Desktop";
  7. NSString * usersFolder = @"users";
  8. NSArray * users = @[@"10086", @"10010", @"10000"];
  9. NSArray * folders = @[@"images", @"cache", @"download", @"history"];
  10. NSString * usersPath = [rootPathstringByAppendingPathComponent:usersFolder];
  11. for (NSString * user in users){
  12. for (NSString * folder in folders) {
  13. NSString * folderPath = nil;
  14. folderPath = [usersPathstringByAppendingPathComponent:user];
  15. folderPath = [folderPathstringByAppendingPathComponent:folder];
  16. //创建目录创建文件夹,withIntermediateDirectories是否顺便创建中间没有创建的文件夹
  17. [fileManagercreateDirectoryAtPath:folderPathwithIntermediateDirectories:YESattributes:nilerror:nil];
  18. NSString *filePath = [folderPathstringByAppendingPathComponent:@"data"];
  19. NSString *string = @"123456";
  20. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  21. //创建文件
  22. [fileManagercreateFileAtPath:filePathcontents:dataattributes:nil];
  23. }
  24. }
  25. }
  26. return 0;
  27. }

如果是10086文件夹,则使用fileManager的方法removeItemAtPath:error:将data文件删除,代码如下所示:

 
  1. int main(intargc, const char * argv[])
  2. {
  3. @autoreleasepool {
  4. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  5. //创建文件和文件夹
  6. NSString * rootPath = @"/Users/Tarena/Desktop";
  7. NSString * usersFolder = @"users";
  8. NSArray * users = @[@"10086", @"10010", @"10000"];
  9. NSArray * folders = @[@"images", @"cache", @"download", @"history"];
  10. NSString * usersPath = [rootPathstringByAppendingPathComponent:usersFolder];
  11. for (NSString * user in users){
  12. for (NSString * folder in folders) {
  13. NSString * folderPath = nil;
  14. folderPath = [usersPathstringByAppendingPathComponent:user];
  15. folderPath = [folderPathstringByAppendingPathComponent:folder];
  16. //创建目录创建文件夹,withIntermediateDirectories是否顺便创建中间没有创建的文件夹
  17. [fileManagercreateDirectoryAtPath:folderPathwithIntermediateDirectories:YESattributes:nilerror:nil];
  18. NSString *filePath = [folderPathstringByAppendingPathComponent:@"data"];
  19. NSString *string = @"123456";
  20. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  21. //创建文件
  22. [fileManagercreateFileAtPath:filePathcontents:dataattributes:nil];
  23. //删除文件
  24. if ([user isEqualToString:@"10086"]) {
  25. [fileManagerremoveItemAtPath:filePatherror:nil];
  26. }
  27. }
  28. }
  29. }
  30. return 0;
  31. }

运行程序,可以看到10000和10010两个文件夹中的所有子文件夹里面都有data文件,而10086里面则没有。

步骤三:遍历文件夹和文件

使用fileManager的方法contentsOfDirectoryAtPath:遍历刚才创建的users文件夹的内容,该方法将users的子文件名称放进一个数组返回,代码如下所示:

  1. //遍历文件夹下的子文件/子文件夹
  2. NSArray *fileNames = [fileManagercontentsOfDirectoryAtPath:usersPatherror:nil];

然后将每个文件名输出,并且使用fileExistsAtPath:isDirectory:方法判断该文件是否为文件夹,代码如下所示:

  1. for (NSString *fileName in fileNames) {
  2. BOOL isDirectory;
  3. NSString *filePath = [usersPathstringByAppendingPathComponent:fileName];
  4. //判断文件是否存在,以引用参数isDirectory返回是否为文件夹
  5. if ([fileManagerfileExistsAtPath:filePathisDirectory:&isDirectory]) {
  6. NSLog(@"%@是文件夹,isDirectory:%d",fileName,isDirectory);
  7. }
  8. }

步骤四:拷贝文件

使用fileManager的方法copyItemAtPath:toPath:将一张图片拷贝到电脑桌面,代码如下所示:

 
  1. //首先判断文件是否存在
  2. if ([fileManagerfileExistsAtPath:@"/Users/Tarena/Pictures/IMG_5723.JPG"]) {
  3. //拷贝文件
  4. [fileManagercopyItemAtPath:@"/Users/Tarena/Pictures/IMG_5723.JPG" toPath:@"/Users/Tarena/Desktop/photo.jpg" error:nil];
  5. }

4.4 完整代码

本案例中,main.m文件中的完整代码如下所示:

 
  1. #import<Foundation/Foundation.h>
  2. int main(intargc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. NSFileManager * fileManager = [NSFileManagerdefaultManager];
  6. //创建文件和文件夹
  7. NSString * rootPath = @"/Users/Tarena/Desktop";
  8. NSString * usersFolder = @"users";
  9. NSArray * users = @[@"10086", @"10010", @"10000"];
  10. NSArray * folders = @[@"images", @"cache", @"download", @"history"];
  11. NSString * usersPath = [rootPathstringByAppendingPathComponent:usersFolder];
  12. for (NSString * user in users){
  13. for (NSString * folder in folders) {
  14. NSString * folderPath = nil;
  15. folderPath = [usersPathstringByAppendingPathComponent:user];
  16. folderPath = [folderPathstringByAppendingPathComponent:folder];
  17. //创建目录创建文件夹,withIntermediateDirectories是否顺便创建中间没有创建的文件夹
  18. [fileManagercreateDirectoryAtPath:folderPath
  19. withIntermediateDirectories:YES
  20. attributes:nil
  21. error:nil];
  22. NSString *filePath = [folderPathstringByAppendingPathComponent:@"data"];
  23. NSString *string = @"123456";
  24. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  25. //创建文件
  26. [fileManagercreateFileAtPath:filePathcontents:dataattributes:nil];
  27. //删除文件
  28. if ([user isEqualToString:@"10086"]) {
  29. [fileManagerremoveItemAtPath:filePatherror:nil];
  30. }
  31. }
  32. }
  33. //遍历文件夹下的子文件/子文件夹
  34. NSArray *fileNames = [fileManagercontentsOfDirectoryAtPath:usersPatherror:nil];
  35. for (NSString *fileName in fileNames) {
  36. BOOL isDirectory;
  37. NSString *filePath = [usersPathstringByAppendingPathComponent:fileName];
  38. //判断文件是否存在,以引用参数isDirectory返回是否为文件夹
  39. if ([fileManagerfileExistsAtPath:filePathisDirectory:&isDirectory]) {
  40. NSLog(@"%@是文件夹,isDirectory:%d",fileName,isDirectory);
  41. }
  42. }
  43. //首先判断文件是否存在
  44. if ([fileManagerfileExistsAtPath:@"/Users/Tarena/Pictures/IMG_5723.JPG"]) {
  45. //拷贝文件
  46. [fileManagercopyItemAtPath:@"/Users/Tarena/Pictures/IMG_5723.JPG" toPath:@"/Users/Tarena/Desktop/photo.jpg" error:nil];
  47. }
  48. }
  49. return 0;
  50. }

NSData、NSString 、 NSFileManager的更多相关文章

  1. NSData和NSString 、 NSFileManager

    1 NSData和NSMutableData的基本使用 1.1 问题 NSData类是IOS提供的用于以二进制的形式操作文件数据的类,NSData有两个常用的属性length和bytes,length ...

  2. 转:用法总结:NSNumber、NSString、NSDate、NSCalendarDate、NSData(待续)

    NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (in ...

  3. (Foundation)NSObject 、 NSString 、 NSMutableString

    1 重构Student和Book类 1.1 问题 本案例需要创建一个Book类,类中有一个整型price属性,用于记录书的价格.还需要创建一个Student类,类中有两个带参属性,它们是整型的年龄ag ...

  4. iOS开发NSDate、NSString、时间戳之间的转化

    //将UTCDate(世界标准时间)转化为当地时区的标准Date(钟表显示的时间) //NSDate *date = [NSDate date]; 2018-03-27 06:54:41 +0000 ...

  5. 01-Foundation简介、NSObject、copy、NSString

    目录: 一.Foundation常用类 二.Foundation简介 三.NSObject 四.NSString 回到顶部 一.Foundation常用类 1 NSObject.NSString.NS ...

  6. 网络HTTP、JSON、XML解析等 复习

    一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...

  7. 01-IOSCore - NSString、NSFileManager、NSBundle、StringAndObjectConvert

    模型 1 将数据存储到硬盘,将硬盘上的数据在读回内存 2 文件存储: NSFileHandle 对文件的读写 NSData 二进制数据 NSString 表示文件路径 NSFileManager(对文 ...

  8. NSString、NSData、char* 类型之间的转换-备

    1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...

  9. NSString、NSMutableString基本用法

    NSString其实是一个对象类型.NSString是NSObject(Cocoa Foundation的基础对象)的子类 一.NSString的创建 1.创建常量字符串.NSString *astr ...

随机推荐

  1. C++智能指针初学小结

    本篇随笔仅作为个人学习<C++ Primer>智能指针一节后的部分小结,抄书严重,伴随个人理解.主要介绍shared_ptr.make_shared.weak_ptr的用法和联系. C++ ...

  2. MFC中函数名前加 :: 原因

    在开发MFC之前,开发的是以AFx(Application Frameworks,x是没有什么意义的)开头的一些函数.但是那个时候开发的函数并没有进行封装,但是有很多很有用的函数.最后AFx开发失败, ...

  3. CF 8D Two Friends 【二分+三分】

    三个地点构成一个三角形. 判断一下两个人能否一起到shop然后回家,如果不能: 两个人一定在三角形内部某一点分开,假设沿着直线走,可以将问题简化. 三分从电影院出来时候的角度,在对应的直线上二分出一个 ...

  4. js prototype之诡异

    想必经常写js的人必然会经常性的用到prototype这个属性,我写这篇文章倒不是自己对prototype这个属性理解有多深刻,相反是因为自己理解肤浅,想通过写文章来加深理解.废话不多说.下面总结一下 ...

  5. sql 字段先计算后再拿比对的字段进行比对 效率提升100倍

    关于日期索引的使用,不要计算后再对比,否则使用不了索引例如:以下执行不了索引,耗时很大 dywl=# explain analyze SELECT car_bill.billno,car_bill.b ...

  6. UVA1589 Xiangqi

    Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...

  7. 使用 JUnit 进行单元测试 - 教程

    tanyuanji@126.com 版本历史 JUnit 该教程主要讲解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit   目录 tanyuanji@126. ...

  8. Windows软件使用Q&A集锦【持续更新】

    以下不注明原创的均为转载,感谢原作者,希望大家电脑用的都舒心 Q: QQ电脑管家的默认程序的程序推荐如何关闭?我右键点击文件打开方式,选择默认程序的时候,qq管家总弹出来,还给我推荐程序.如何关闭? ...

  9. 原已经安装好的nginx,现在需要添加一个未被编译安装的模块--echo-nginx-module-0.56

    为了测试一个NGINX变量,将NGINX加了一个编译模板echo-nginx-module-0.56. 参照如下文件 1,先看以前NGINX有哪些东东. sbin/nginx -Vnginx vers ...

  10. codechef Prime Distance On Tree(树分治+FFT)

    题目链接:http://www.codechef.com/problems/PRIMEDST/ 题意:给出一棵树,边长度都是1.每次任意取出两个点(u,v),他们之间的长度为素数的概率为多大? 树分治 ...