您的位置:首页 > 其它

oc自学-使用文件

2015-09-10 14:56 239 查看

Foundation框架允许你利用文件系统对文件或目录执行基本操作。这些操作是有NSFileManager类提供的,具有如下功能:创建一个新文件,从现有文件中读取数据,将数据写入文件,重命名文件,删除文件,测试文件是否存在,确定文件的大小和其他属性,复制文件,测试两个文件的内容是否相同。

上面的多数方法也可以对目录进行操作,另一个重要特性是链接文件,即同一个文件存在两个不同的名字,有时甚至位于不同的目录中。

使用NSFileHandle类提供的方法,可以打开文件并对文件执行多次读/写操作。NSFileHandle类可以实现如下功能:打开一个文件,执行读、写或更新操作,在文件中查找指定位置,从文件中读取特定数目的字节,或将指定数目的字节写入文件中。

NSFileHandle类提供的方法也可用于各种设备或套接字。

NSURL类允许在应用中使用URL方法。

NSBundle类提供允许在应用中使用包(bundle)的方法,包括搜索包中的特定资源(如JPEG图片)。

管理文件和目录:NSFileManager

对于NSFileManager,文件或目录是使用文件的路径名的唯一表示。每个路径名都是NSString对象。

相对路径:ch16/copy.m,存储在ch16中的文件copy1.m,ch16包含在当前目录中

绝对路径:/users/stevekochan,一斜线(/)开始。

特殊的带字符(~)作为用户主目录的缩写。~linda可能是/User/linda。

   我们可以通过使用方法和函数来获取当前目录的路径名、用户的主目录及可以用来创建零时文件的目录。

常见NSFileManager文件方法:P381,这些方法都是对象方法。创建NSFileManager对象:

NSFileManager *fm;
...
fm = [NSFileManager defaultManager];
//删除名为todolist的文件,先创建NSFileManager对象,再调用removeItemAtPath方法。
if([fm removeItemAtPath: @"todolist error: NULL"] == NO) {
NSLog(@"Couldn`t remove file todolist");
}

对于现有的文件,属性字典包括各种信息,如文件的所有者、文件大小、文件的创建日期等等。字典的每个属性可以通过键值提取,而所有的键都定义在头文件<Foundation/NSFileManager.h>中。例如,表示文件大小的键值为NSFileSize。

代码使用:P382-384


使用NSData类

使用文件时,需要频繁的将数据读入到一个临时存储区(缓冲区)。NSData类,用来设置缓冲区、将文件的内容读入缓冲区,或将缓冲区的内容写到一个文件。定义不可变缓冲区(NSData类),可变缓冲区(NSMutableData类)。

NSData *fileData;
fileData = [fm contentsAtPath: @"newfile2"];
if (fileData == nil ){
NSLog(@“File read failed!”);
return 1
}
if ([fm creatFileAtPath: @"newfile3" contens: fileData attributes: nil] == NO) {
NSLog(@"Couldn`t creat the copy");
return 2
}

使用目录

NSFileManager常见的目录方法:P387

代码清单:P387-388


枚举目录中的内容

enumeratorAtPath: 方法,一次可以枚举指定目录中的每个文件,默认情况下,其中一个文件为目录,那么也会递归枚举它的内容。在过程中,通过向枚举对象发送一条skipDescendants消息,可以动态的阻止递归过程,从而不在枚举目录中的内容。

contentsOfDirectoryAtPath:error:方法可以枚举指定目录的内容,并在一个数组中返回文件列表。如果这个目录中任何文件本身是一个目录,这个方法并不递归枚举它的内容。

NSString *path;
NSFileManager *fm;
NSDirectoryEnumerator *dirEnum;
NSArray *dirArray;
fm = [NSFileManager defaultManager];
path = [fm currentDirectoryPath];

dirEnum = [fm enumeratorAtPath: path];
while ((path = [dirEnum nextObject]) != nil) {
NSLog(@"%@",path);
[fm fileExistsAtPath: path isDirectory: &flag];
if (flag == YES) {
[dirEnum skipDescendents];
}
}
dirArray = [fm contentsOfDirectoryaAtPath: [fm currentDirectioryPath] error: NULL];
//NSLog(@"%@",dirArray)
for (path in dirArray) {
NSLog(@"%@",path)
}

使用路径: NSPathUtilities.h

常见路径方法:P394-395

//返回文件saveFile在Documents目录中的路径.

-(NSString *) saveFilePath
{
NSArray *dirList = NSSearchPathForDirectioriesInDomains(NSDocumentsDirectory,NSUserDomainMask,YES);
NSString *docDir = dirList[0];
return [docDir striingByAppendingPathComponent: @"saveFile"];
}

常见ios目录:P395

复制文件和使用NSProcessInfo类

使用命令行工具来实现简单的文件复制操作:

copy from-file to-file

to-file可以是目录名,文件以名称from-file被复制到to-file目录中。如果to-file目录已存在,允许覆盖其内容。

通过在main函数中使用argv和argc参数,可以从命令行中获得文件名。这两个参数分别包括命令行中键入的参数个数(包括命令名),以及指向C风格的字符串数组的指针。

NSProcessInfo允许你设置或检索正在运行的应用程序(即进程)的各种类型的信息。

NSProcessInfo类方法:P397


基本的文件操作:NSFIleHandle

一般而已,处理文件需要经历一下步骤:

1、打开文件,并获取一个NSFileHandle对象,一变在后面的I/O操作中引用该文件。

2、对打开的文件执行I/O操作。

3、关闭文件。

常用的NSFileHandle方法:P400

NSFileHandle *inFile,*outFile;
NSData *buffer;
//打开outFile文件进行写入
outFile = [NSFileHandle fileHandleForWritingAtPath: @"testout"];
if (outFile == nil) {
NSLog(@"");
return 2
}
//因为它可能包含数据,截断输出文件
[outFile truncateFileAtOffset: 0];
//从inFile中读取数据,将它写到outFile
buffer = [inFile readDataToEndOfFile];
[outFile writeData: buffer];
//关闭这两个文件
[inFile closeFile];
[outFile closeFile];
//验证文件内容
NSLog(@"%@",[NSString stringWithContentsOfFile: @"testout" encoding: NSUTF8StringEncoding error: NULL]);
NSURL类

如何通过程序从一个网站读取HTML内容

NSURL *myURL = [NSURL URLWithString: @"http:/classroomM.com""];
NSString *myHomePage = [NSString stringWithContentOfURL: myURL encoding: NSASCIIStringEncoding error: NULL];
dictionaryWithContentsOfURL arrayWithContentsOfURL

dataWithContentsOfURL

NSBundle类
当创建一个应用时,系统存储了应用相关联的所有数据(包括图片、本地化字符串、图标等),将这些内容放入一个称为应用包(application bundle)的包中。

//返回存储在应用包中instructions.txt文件的路径
NSString *txtFilePath = [[NSBundle mainBundle] pathForResource: @"instructions" ofType: @"text"];
mainBundle方法给出了应用包所在的目录。 如果希望列出在应用包的图片目录中所有以jpg为文件名的JPEG图片,需要使用到pathsForResourceOfType:inDirectory:方法:

NSArray *birds = [[NSBundle mainBundle] pathsForResourcesOfType: @"jpg" inDirectory: @"birdImages"];



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: