• NSData和NSString 、 NSFileManager


    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语言字符串末尾的
    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. }
  • 相关阅读:
    UID卡、CUID卡、FUID卡的区别
    高中数学B版 高中数学A版
    Cenots7 服务搭建之搞清用户和组
    Flink 流处理 word count
    Flink Batch File Word Count
    Flink程序运行完yarn 模式后,返回运行standalone模式运行时。经常会出现运行不成功原因分析.
    Kafka消费者 API(自动提交offset)
    kafka 同步发送消息
    kafka 自定义分区
    kafka生产者 API Demo
  • 原文地址:https://www.cnblogs.com/52190112cn/p/5049501.html
Copyright © 2020-2023  润新知