Foundation框架中的文件和目录


Foundation框架中的文件和目录

内容概述

  • 使用NSFileManager管理文件
  • 使用NSFileManager管理目录
  • 使用NSFileHandler读写文件

14.1 使用NSFileManager管理文件

可以使用NSFileManager类来管理文件系统中的文件和目录。使用NSFileManager可以定位、创建、拷贝和删除文件和目录。也可以通过NSFileManager类来获得文件和目录的信息,例如,创建时间、文件大小等。可以使用NSFileManagerDelegate代理类来监控文件的操作过程。下面我们就针对如何定位文件、判断文件是否存在、创建文件、删除文件、写文件、读文件、拷贝文件重命名文件和获得文件属性等操作来详细讲述。

  1. 定位文件。定位文件可以使用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/

  1. 判断文件是否存在,判断文件是否存在可以使用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!");

    }

}
  1. 创建文件,可以使用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");

    }

}
  1. 删除文件,可以使用- (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!");

    }

}
  1. 写文件,简单的字符串格式的文件,可以使用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");

    }

}
  1. 读文件,简单的字符串格式内容文件,可以使用字符串的+ (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);

}
  1. 拷贝文件,拷贝文件可以使用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");

    }

}
  1. 重命名文件,可以使用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");

    }

}
  1. 获得文件属性,可以使用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不光可以管理文件,而且还可以管理目录。可以创建目录、删除目录、获得当前目录和遍历目录等。

  1. 创建目录,创建目录可以使用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.");

    }

}
  1. 删除目录,可以使用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!");

    }

}
  1. 获得当前文件目录,可以使用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

  1. 遍历文件目录,可以使用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进行文件读写。

  1. 创建NSFileHandler,可以使用字符串或NSURL来创读文件、写文件、更新文件和标准输入输出文件的NSFileHandler对象。
NSFileHandle *readFile;

// 实例化读文件管理器

readFile = [NSFileHandle fileHandleForReadingAtPath:@"/tmp/Hello.txt"];

// 创建写文件处理器

NSFileHandle *writeFile = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/newFile"];
  1. 读文件,可以使用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);

}
  1. 写文件,可以使用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];

}