Foundation框架中的文件和目录 Foundation框架中的集合框架 Objective C中对象的复制 Foundation框架中的文件和目录 内容概述 使用NSFileManager管理文件 使用NSFileManager管理目录 使用NSFileHandler读写文件 14.1 使用NSFileManager管理文件 可以使用NSFileManager类来管理文件系统中的文件和目录。使用NSFileManager可以定位、创建、拷贝和删除文件和目录。也可以通过NSFileManager类来获得文件和目录的信息,例如,创建时间、文件大小等。可以使用NSFileManagerDelegate代理类来监控文件的操作过程。下面我们就针对如何定位文件、判断文件是否存在、创建文件、删除文件、写文件、读文件、拷贝文件重命名文件和获得文件属性等操作来详细讲述。 定位文件。定位文件可以使用NSFileManager实例的- (NSArray *)URLsForDirectory:(NSSearchPathDirectory)directory inDomains:(NSSearchPathDomainMask)domainMask方法来实现。该方法返回一个路径的NSURL数组,方法的第一个参数是要定位的路径,该路径定义了如下常量。例如,要获得应用程序路径则使用NSApplicationDirectory,要获得文档路径则使用NSDocumentDirectory。 enum { NSApplicationDirectory = 1, NSDemoApplicationDirectory, NSDeveloperApplicationDirectory, NSAdminApplicationDirectory, NSLibraryDirectory, NSDeveloperDirectory, NSUserDirectory, NSDocumentationDirectory, NSDocumentDirectory, NSCoreServiceDirectory, NSAutosavedInformationDirectory = 11, NSDesktopDirectory = 12, NSCachesDirectory = 13, NSApplicationSupportDirectory = 14, NSDownloadsDirectory = 15, NSInputMethodsDirectory = 16, NSMoviesDirectory = 17, NSMusicDirectory = 18, NSPicturesDirectory = 19, NSPrinterDescriptionDirectory = 20, NSSharedPublicDirectory = 21, NSPreferencePanesDirectory = 22, NSApplicationScriptsDirectory = 23, NSItemReplacementDirectory = 99, NSAllApplicationsDirectory = 100, NSAllLibrariesDirectory = 101, NSTrashDirectory = 102 }; typedef NSUInteger NSSearchPathDirectory; 第二个参数是要定位的文件系统域,内容如下: enum { NSUserDomainMask = 1, NSLocalDomainMask = 2, NSNetworkDomainMask = 4, NSSystemDomainMask = 8, NSAllDomainsMask = 0x0ffff, }; 可以使用用户域、本地域、网络域和所有域常量。下面代码实现了获得用户文档路径的的方法。 // 定位文件 -(void)locate{ // 获得NSFileManager实例 NSFileManager *fm = [NSFileManager defaultManager]; // 获得文件路径 NSArray *paths = [fm URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; if ([paths count]>0) { NSURL *url = [paths objectAtIndex:0]; NSLog(@"url=%@",url); } } 程序输出结果如下: url=file://localhost/Users/amaker/Documents/ 判断文件是否存在,判断文件是否存在可以使用NSFileManager的- (BOOL)fileExistsAtPath:(NSString *)path,该方法返回BOOL值,YES表示存在,NO表示不存在。 -(void)isExists{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 要查找的文件 NSString *myFile = @"/tmp/Hello.txt"; // 判断文件是否存在 BOOL result = [fm fileExistsAtPath:myFile]; if (result) { NSLog(@"%@",@"file exist!"); }else{ NSLog(@"%@",@"file not exist!"); } } 创建文件,可以使用NSFileManager的- (BOOL)createFileAtPath:(NSString )path contents:(NSData )contents attributes:(NSDictionary *)attributes方法来创建文件,第一个参数是文件路径,第二个参数是文件内容,第三个参数是文件属性。如果返回YES表示创建成功,NO创建失败。 // 创建文件 -(void)createFile{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 要创建文件的路径 NSString *myFile = @"/tmp/Hello.txt"; // 内容 NSString *content = @"Hello World!"; // 创建文件 BOOL result = [fm createFileAtPath:myFile contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; // 判断是否创建成功 if (result) { NSLog(@"create ok"); }else{ NSLog(@"create error"); } } 删除文件,可以使用- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error方法删除文件,第一个参数是要删除文件的路径,第二个参数是否报错。返回YES表示删除成功,NO表示失败。 // 删除文件 -(void)removeFile{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 要删除的文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 删除文件 BOOL result = [fm removeItemAtPath:myFile error:nil]; // 判断是否删除成功 if (result) { NSLog(@"remove ok!"); }else{ NSLog(@"remove error!"); } } 写文件,简单的字符串格式的文件,可以使用NSString的- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error方法实现写入文件。第一个参数是要写的文件路径,第二个参数是是否覆盖原有文件,第三个是字符编码,第四个是出错信息。 -(void)writeFile{ // 要保存的文件内容 NSString *fileContent = @"Hello World!"; // 文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 写文件 BOOL result = [fileContent writeToFile:myFile atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 判断是否成功 if (result) { NSLog(@"%@",@"create ok"); }else{ NSLog(@"%@",@"create fail"); } } 读文件,简单的字符串格式内容文件,可以使用字符串的+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error方法来实现。第一个参数是文件路径,第二个是字符编码,第三个是报错信息。 // 读文件 -(void)readFile{ // 要读取的文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 文件内容 NSString *tempContent = [NSString stringWithContentsOfFile:myFile encoding:NSUTF8StringEncoding error:nil]; // 输出 NSLog(@"fileContent = %@",tempContent); } 拷贝文件,拷贝文件可以使用NSFileManager的- (BOOL)copyItemAtPath:(NSString )srcPath toPath:(NSString )dstPath error:(NSError **)error方法,第一个参数是源文件路径,第二个是目标文件路径,第三个是报错信息。 // 拷贝文件 -(void)copyFile{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 拷贝文件 BOOL result = [fm copyItemAtPath:myFile toPath:@"/tmp/newFile.txt" error:nil]; // 判断是否拷贝成功 if (result) { NSLog(@"%@",@"copy ok"); }else{ NSLog(@"%@",@"copy fail"); } } 重命名文件,可以使用NSFileManager的- (BOOL)moveItemAtPath:(NSString )srcPath toPath:(NSString )dstPath error:(NSError **)error方法,第一个参数是源文件路径,第二个参数是目标文件路径,第三个是报错信息。 // 重命名文件 -(void)renameFile{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 重命名文件 BOOL result = [fm moveItemAtPath:myFile toPath:@"/tmp/newFile2" error:nil]; // 判断是否重命名成功 if (result) { NSLog(@"%@",@"rename ok"); }else{ NSLog(@"%@",@"rename fail"); } } 获得文件属性,可以使用NSFileManager的- (NSDictionary )attributesOfItemAtPath:(NSString )path error:(NSError **)error方法获得文件属性,第一个参数的文件路径,第二个是报错信息。返回值的文件属性的字典类型。 // 获得文件属性 -(void)getFileAttributes{ // 获得NSFileManager实例 NSFileManager *fm = [self getFileManager]; // 文件路径 NSString *myFile = @"/tmp/Hello.txt"; // 文件属性 NSDictionary *attr = [fm attributesOfItemAtPath:myFile error:nil]; NSLog(@"%@",attr); // 遍历文件属性 for(NSString *key in attr){ NSLog(@"%@:%@",key,[attr objectForKey:key]); } } 14.2 使用NSFileManager管理目录 使用NSFileManager不光可以管理文件,而且还可以管理目录。可以创建目录、删除目录、获得当前目录和遍历目录等。 创建目录,创建目录可以使用NSFileManager的- (BOOL)createDirectoryAtPath:(NSString )path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary )attributes error:(NSError **)error方法,第一个参数是目录路径,第二个是是否覆盖已存在的目录,第三个参数是设置的目录属性,第四个是报错信息。 // 创建目录 -(void)createDir{ // 实例化NSFileManager NSFileManager *fm = [NSFileManager defaultManager]; // 创建目录 BOOL result = [fm createDirectoryAtPath:@"/tmp/guohz/" withIntermediateDirectories:YES attributes:nil error:nil]; // 判断结果 if (result) { NSLog(@"%@",@"create ok."); }else{ NSLog(@"%@",@"create fail."); } } 删除目录,可以使用NSFileManager的- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error放来删除目录,第一个参数是要删除的目录路径,第二个是报错信息。 // 删除目录 -(void)removeDir{ // 实例化NSFileManager NSFileManager *fm = [NSFileManager defaultManager]; // 删除目录 BOOL result = [fm removeItemAtPath:@"/tmp/ghz" error:nil]; // 判断结果 if (result) { NSLog(@"%@",@"remove ok!"); }else{ NSLog(@"%@",@"remove fail!"); } } 获得当前文件目录,可以使用NSFileManager的- (NSString *)currentDirectoryPath方法获得当前文件目录。 // 获得当前路径 -(void)getCurrentDir{ // 实例化NSFileManager NSFileManager *fm = [NSFileManager defaultManager]; // 获得当前目录 NSString *currentPath = [fm currentDirectoryPath]; NSLog(@"currentPath = %@",currentPath); } 该程序输出结果为: /Users/amaker/Library/Developer/Xcode/DerivedData/chapter14-02-ckhcuqfijttvqugdxifwmemocekz/Build/Products/Debug 遍历文件目录,可以使用NSFileManager的- (NSArray )contentsOfDirectoryAtPath:(NSString )path error:(NSError **)error的方法遍历文件目录,第一个参数是要遍历的目录,第二个参数是报错信息。 // 遍历目录内容 -(void)listDir{ // 实例化NSFileManager NSFileManager *fm = [NSFileManager defaultManager]; // 文件目录 NSString *path = @"/tmp"; // 遍历文件 NSArray *content = [fm contentsOfDirectoryAtPath:path error:nil]; for(NSString *item in content){ NSLog(@"%@",item); } } 14.3 使用NSFileHandler读写文件 上一节我们学习了可以使用NSFileManager读写字符串类型的文件,但是如果文件类型是其他,例如,图片、设备、网络接口等,NSFileManager就无能为力了。这里我们要学习的是NSFileHandler,该类是文件描述符的封装类,可以读写文件、套接字、管道和设备。 本节我们来学习如何创建NSFileManager,以及使用NSFileManager进行文件读写。 创建NSFileHandler,可以使用字符串或NSURL来创读文件、写文件、更新文件和标准输入输出文件的NSFileHandler对象。 NSFileHandle *readFile; // 实例化读文件管理器 readFile = [NSFileHandle fileHandleForReadingAtPath:@"/tmp/Hello.txt"]; // 创建写文件处理器 NSFileHandle *writeFile = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/newFile"]; 读文件,可以使用NSFileHandle的- (NSData )readDataToEndOfFile方法一次读到文件末尾,也可以使用- (NSData )readDataOfLength:(NSUInteger)length;方法读取固定长度的数据。 -(void)readFile{ NSFileHandle *readFile; NSData *buffer; // 1. 实例化 readFile = [NSFileHandle fileHandleForReadingAtPath:@"/tmp/Hello.txt"]; // 读文件直到文件尾部 buffer = [readFile readDataToEndOfFile]; // 将NSData 转换为字符串 NSString *temp = [[NSString alloc]initWithData:buffer encoding:NSUTF8StringEncoding]; // 关闭文件 [readFile closeFile]; // 显示文件内容 NSLog(@"%@",temp); } 写文件,可以使用NSFileHandle的+ (id)fileHandleForWritingAtPath:(NSString *)path方法将文件写到指定的文件路径中。 -(void)writeFile{ // 创建写文件处理器 NSFileHandle *writeFile = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/newFile"]; // 将字符串转换为NSData NSString *temp2 = @"Hello everyone!"; NSData *buffer2 = [temp2 dataUsingEncoding:NSUTF8StringEncoding]; // 写NSData [writeFile writeData:buffer2]; // 关闭文件 [writeFile closeFile]; } Foundation框架中的集合框架 Objective C中对象的复制