Objective-C-20程序设计-第16章-使用文件_第1页
Objective-C-20程序设计-第16章-使用文件_第2页
Objective-C-20程序设计-第16章-使用文件_第3页
Objective-C-20程序设计-第16章-使用文件_第4页
Objective-C-20程序设计-第16章-使用文件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第16章章 使用文件使用文件 武汉大学国际软件学院Objective-C 2.0程序设计2目录目录v16.1 管理文件和目录管理文件和目录:NSv16.2 使用路径使用路径:NSPathUtilities.hv16.3 基本的文件操作基本的文件操作:NS武汉大学国际软件学院Objective-C 2.0程序设计316.1 管理文件和目录管理文件和目录:NSv对于对于NS,文件或目录是使用文件的路径名唯一的文件或目录是使用文件的路径名唯一的标石的。每个路径名都是一个标石的。每个路径名都是一个NSString对象对象,它它既可以是相对路径名既可以是相对路径名,也可以是完整路径名。相也可以是完整路

2、径名。相对路径名是相对于当前目录的路径名。所以对路径名是相对于当前目录的路径名。所以,文文件名件名copy1.m意味着当前目录中的文件意味着当前目录中的文件copy1.m。v完整路径名完整路径名,也称为绝对路径名也称为绝对路径名,以斜线以斜线/开始开始,斜斜线实际上就是一个目录线实际上就是一个目录,称为根目录。称为根目录。v这个特殊的代字符这个特殊的代字符用作用户目录的缩写。用作用户目录的缩写。武汉大学国际软件学院Objective-C 2.0程序设计416.1 管理文件和目录管理文件和目录:NS武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:

3、NSv每个文件方法都是对每个文件方法都是对NS对象的调用对象的调用,而而NS对象对象是通过向类发送一是通过向类发送一 条条defauItManager消息创消息创建的建的,如下所示如下所示: NS *fm; . fm = NS defaultManager;武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv例如例如,要从当前目录删除名为要从当前目录删除名为todolist的文件的文件,首首先要创建一个先要创建一个NS对象(如前对象(如前 面所示)面所示),然后调用然后调用remove方法方法,代码如下代码如下: fm remove: ”to

4、dolist” handler: nil; 可以测试返回结果可以测试返回结果,以确保成功地删除该文件。以确保成功地删除该文件。 if (fm remove: ”todolist” handler: nil = NO) NSLog (”Couldnt remove ”); return 1; 武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv 除了其他事情之外除了其他事情之外,属性字典还允许你指定要创建的文件属性字典还允许你指定要创建的文件的权限的权限,以便获取或者更改现有以便获取或者更改现有 文件的信息。对于文件创文件的信息。对于文件创建建

5、,如果将该参数指定为如果将该参数指定为nil,将会为该文件设置默认权将会为该文件设置默认权限。限。 :方法返回一个包含指定文件厲性的宇典。对于符号方法返回一个包含指定文件厲性的宇典。对于符号链接链接 (symbolic link), traverseLink:参数的值为参数的值为yes或或no。如果该文件是一个符号链接。如果该文件是一个符号链接,则指定则指定yes, 并并且返回链接到的文件厲性。如果指定且返回链接到的文件厲性。如果指定no,则返回链接本身则返回链接本身的属性。的属性。v 对于现有的文件对于现有的文件,属性字典包括各种信息属性字典包括各种信息,如文件的所有者、如文件的所有者、文件

6、大小、文件的创建曰期文件大小、文件的创建曰期, 等等。字典的每个属性都可等等。字典的每个属性都可以根据其键来提取以根据其键来提取,而所有键都定义在头文件而所有键都定义在头文件(Foundation/ NS中。例如中。例如,表示文件大小的键为表示文件大小的键为NS。武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv代码清单代码清单16-1展示了一些基本的文件操作。这展示了一些基本的文件操作。这个例子假设当前目录中存在一个名为个例子假设当前目录中存在一个名为testfile 的的文件文件,文件的内容如下文件的内容如下:/ Basic / Ass

7、umes the existence of a “testfile”/ in the current working directory#import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSString *fName = ”testfile”;NS *fm;NSDictionary *attr;武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:N

8、S/ Need to create an instance of the fm = NS defaultManager;/ Lets make sure our test firstif (fm : fName = NO) NSLog (”t exist!”);return 1;/ Now lets make a copyif (fm copyPath: fName toPath: ”newfile” handler: nil = NO) NSLog (” failed!”);return 2;/ Lets test to see if the two files are identicali

9、f (fm contentsEqualAtPath: fName andPath: ”newfile” = NO) NSLog (”Files are not equal!”);return 3;/ Now lets rename the copyif (fm movePath: ”newfile” toPath: ”newfile2”handler: nil = NO) NSLog (” failed!”);return 4;武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NS/ Get the size of newfile2if (att

10、r = fm : ”newfile2”traverseLink: NO) = nil) NSLog (”Couldnt get !”);return 5;NSLog (” is %i bytes”,attr objectForKey: NS intValue);/ And finally, lets delete the original fileif (fm remove: fName handler: nil = NO) NSLog (” failed!”);return 6;NSLog (”All operations were successful!”);/ Display the c

11、ontents of the newly-created fileNSLog(”%” NSString stringWithContentsOfFile: ”newfile2”);pool drain;return 0;武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv程序程序16.1 输出输出 is 84 bytesAll operations were successful!This is a test some data in it.Heres another line of data.And a third. 这个程序首先测试这个程

12、序首先测试testfile文件是否存在。如果文件是否存在。如果存在存在,则复制则复制testfile文件文件,然后比较原文件然后比较原文件 和复和复制文件是否相等。经验丰富的制文件是否相等。经验丰富的UNIX用户都知道用户都知道,不能只通过为方法不能只通过为方法copyPath:toPath:和和 movePath:toPath:指定目标目录指定目标目录,就将文件就将文件移动或复制到这个目录中移动或复制到这个目录中,必须明确地指定目录必须明确地指定目录中的文件名。中的文件名。武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv movePat

13、h:toPath方法可以用来将文件从一个目录移到另一个目方法可以用来将文件从一个目录移到另一个目录中(也可以用来移动整个目录)。如果两个路径引用同一目录中录中(也可以用来移动整个目录)。如果两个路径引用同一目录中的文件(如本例所示)的文件(如本例所示),其结果仅仅是重新命名这个文件其结果仅仅是重新命名这个文件.因此因此,在代在代码清单码清单16-1中中,使用这个方法将文件使用这个方法将文件newfile重新命名为重新命名为newfile2。v 如表如表16-1所示所示,在执行复制、重命名或移动操作时在执行复制、重命名或移动操作时,目标文件不能是目标文件不能是已存在的已存在的;否则否则,操操 作

14、将失败。作将失败。v newfile2的大小是通过使用的大小是通过使用:方法确定的。测试并确保返回了一个方法确定的。测试并确保返回了一个非非nil目录目录,然后使用然后使用NSDictionary类中的方法类中的方法objectForKey:,并用键并用键NS从字典中获得文件的太小。最后从字典中获得文件的太小。最后,显示字典中表示文件大显示字典中表示文件大小的整数值。小的整数值。 程序使用程序使用remove:方法来删除原始文件方法来删除原始文件testfile。武汉大学国际软件学院Objective-C 2.0程序设计16.1 管理文件和目录管理文件和目录:NSv最后最后,使用使用NSStr

15、ing的的stringWithContentsOfFile:方法将文件方法将文件newfile2的内容读入一个宇符串对象的内容读入一个宇符串对象,然后这个然后这个对象作为参数传递给要显示的对象作为参数传递给要显示的NSLog。v在代码清单在代码清单16-1中中,测试每个文件操作以检査它测试每个文件操作以检査它是否成功。如果任何一个操作失败是否成功。如果任何一个操作失败,就会使用就会使用NSLog来记录错误来记录错误,并且程序将通过返回一个非并且程序将通过返回一个非零的退出状态而退出。根据约定零的退出状态而退出。根据约定,每个非每个非 零值郁零值郁表示一次程序失败表示一次程序失败,并且根据错误类

16、型并且根据错误类型,这个值都这个值都是唯一的。如果正在编写命令行工具是唯一的。如果正在编写命令行工具, 这将是一这将是一项有用的技术项有用的技术,因为可以由另一个程序来测试返因为可以由另一个程序来测试返回值回值,比如从一个比如从一个shell脚本中测试。脚本中测试。武汉大学国际软件学院Objective-C 2.0程序设计1416.1.1 使用使用NSData类类v使用文件时使用文件时,需要频繁的将数据读入一个临时存需要频繁的将数据读入一个临时存储区储区,它通常称为缓冲区。当收集数据它通常称为缓冲区。当收集数据,一遍随后一遍随后将这些数据输出到文件中将这些数据输出到文件中,通常也使用储存区。通

17、常也使用储存区。Foundation的的NSData类提供了一种简单的类提供了一种简单的方式方式,它用来设置缓冲区它用来设置缓冲区,将文件的内容读入缓冲将文件的内容读入缓冲区区,或将缓冲区的内容写到一个文件。有一点不或将缓冲区的内容写到一个文件。有一点不要奇怪要奇怪,对于对于32位应用程序位应用程序,NSDATA缓冲区最缓冲区最多可存储多可存储2GB的数据。对于的数据。对于64位应用程序位应用程序,最多最多可存储可存储8EB的数据。的数据。v正如你所期望的正如你所期望的,我们既可以定义不变缓冲区我们既可以定义不变缓冲区,也也可以定义可变的缓冲区。可以定义可变的缓冲区。武汉大学国际软件学院Obj

18、ective-C 2.0程序设计16.1.1 使用使用NSData类类v正如你所期望的正如你所期望的,我们既可以定义不可变缓冲区我们既可以定义不可变缓冲区(使用(使用NSData类)类),也可以定义可变的缓也可以定义可变的缓 冲区冲区(使用(使用NSMutableData类类)。在本章和后续几。在本章和后续几章将介绍这个类的方法。章将介绍这个类的方法。 代码清单代码清单16-2展示了展示了如何方便地将文件的内容读入内存缓冲区。如何方便地将文件的内容读入内存缓冲区。v这个程序读取文件这个程序读取文件newfile2的内容的内容,并将其写人并将其写人一个名为一个名为newfile3的新文件中。从某

19、种意义的新文件中。从某种意义 来来说说,它实现了文件的复制操作它实现了文件的复制操作,尽管它采取的方式尽管它采取的方式并不像方法并不像方法copyPath:toPath:handler那样那样直接。直接。武汉大学国际软件学院Objective-C 2.0程序设计16.1.1 使用使用NSData类类v代码清单代码清单16-2/ Make a copy of a file#import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePoo

20、l alloc init;NS *fm;NSData *;fm = NS defaultManager;/ Read the = fm contentsAtPath: ”newfile2”;if ( = nil) NSLog (” failed!”);return 1;/ Write the data to newfile3if (fm create: ”newfile3” contents: attributes: nil = NO) NSLog (”Couldnt create the copy!”);return 2;NSLog (” was successful!”);pool dra

21、in;return 0;武汉大学国际软件学院Objective-C 2.0程序设计16.1.1 使用使用NSData类类v程序程序16.2输出输出: was successful!vNSData的的ccmtentsAtPath:方法仅仅接受方法仅仅接受一个路径名一个路径名,并将指定文件的内容读人该方法创并将指定文件的内容读人该方法创建建 的存储区的存储区,如果读取成功如果读取成功,这个方法将返回存储这个方法将返回存储区对象作为结果区对象作为结果,否则(例如否则(例如,该文件不存在该文件不存在 或者或者你不能读取)你不能读取),将返回将返回nil。v方法方法createFUeAtPath:con

22、tents:attributes:创建了一个具有特定属性(或者如果创建了一个具有特定属性(或者如果attributes参数提供为参数提供为nil,则采用默认的属性值)则采用默认的属性值)的文件。然后的文件。然后,将指定的将指定的NSData对象内容写入对象内容写入这个文件中这个文件中, 在本例中在本例中,数据区包含前面读取的文数据区包含前面读取的文件内容。件内容。武汉大学国际软件学院Objective-C 2.0程序设计1816.1.2 使用目录使用目录v表表16-2总结了总结了NS提供的用于处理目录的一些方提供的用于处理目录的一些方法。其中大多数方法和用于普通文件的方法相同法。其中大多数方法

23、和用于普通文件的方法相同,如表如表16-1所示。所示。武汉大学国际软件学院Objective-C 2.0程序设计16.1.2 使用目录使用目录v代码清单代码清单16-3展示了一些使用目录的基本操作。展示了一些使用目录的基本操作。/ Some basic directory operations#import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSString *dirName = ”testdir”;NSSt

24、ring *path;NS *fm;/ Need to create an instance of the fm = NS defaultManager;/ Get current directorypath = fm currentDirectoryPath;NSLog (”Current directory path is %”, path);/ Create a new directory武汉大学国际软件学院Objective-C 2.0程序设计16.1.2 使用目录使用目录if (fm createDirectoryAtPath: dirName attributes: nil = N

25、O) NSLog (”Couldnt create directory!”);return 1;/ Rename the new directoryif (fm movePath: dirName toPath: ”newdir” handler: nil = NO) NSLog (”Directory rename failed!”);return 2;/ Change directory into the new directoryif (fm changeCurrentDirectoryPath: ”newdir” = NO) NSLog (”Change directory faile

26、d!”);return 3;/ Now get and display current working directorypath = fm currentDirectoryPath;NSLog (”Current directory path is %”, path);NSLog (”All operations were successful!”);pool drain;return 0;武汉大学国际软件学院Objective-C 2.0程序设计16.1.2 使用目录使用目录v程序程序16-3输出输出:Current directory path is /Users/stevekochan

27、/progs/ch16Current directory path is /Users/stevekochan/progs/ch16/newdirAll operations were successful!武汉大学国际软件学院Objective-C 2.0程序设计16.1.2 使用目录使用目录v代码清单代码清单16-3很容易理解。出于获得信息的目很容易理解。出于获得信息的目的的,首先获取当前的目录路径首先获取当前的目录路径,然后然后,在当在当 前目彔前目彔中创建一个名为中创建一个名为testdir的新目录。然后使用的新目录。然后使用movePath:toPath:handler方法将新目录方

28、法将新目录testdir 重命名为重命名为newdir。记住。记住,这个方法还可这个方法还可以用来将整个目录结构(这意味着包括目录的内以用来将整个目录结构(这意味着包括目录的内容)从容)从 文件系统的一个位置移动到另一个位置。文件系统的一个位置移动到另一个位置。v重命名新目录之后重命名新目录之后,程序使用程序使用changeCurrentDirectoryPath:方法将这方法将这个新目录设置为当前目录。然后个新目录设置为当前目录。然后,显示当前目录显示当前目录路径路径,以验证修改是否成功。以验证修改是否成功。武汉大学国际软件学院Objective-C 2.0程序设计2316.1.3 枚举目录

29、中的内容枚举目录中的内容v有时候需要获得目录的内容列表。使用有时候需要获得目录的内容列表。使用enumeratorAtPath:方法或者方法或者directoryContentsAtPath:方法方法,都可以完都可以完成枚举过程。如果使用第一种方法成枚举过程。如果使用第一种方法,一次可以枚一次可以枚举指定目录中的每个文件举指定目录中的每个文件,默认情况下默认情况下,如果其中如果其中一个文件为目录一个文件为目录,那么也会递归枚举它的内容。那么也会递归枚举它的内容。在这个过程中在这个过程中,通过像枚举对象发送一条通过像枚举对象发送一条skipDescendants消息消息,可以动态的阻止递归可以动

30、态的阻止递归过程过程,从而不再枚举目录中的内容。从而不再枚举目录中的内容。v对于对于directoryContentsAtPath:方法方法,使用使用这个方法。可以枚举指定目录的内容这个方法。可以枚举指定目录的内容,并在一个并在一个数组中返回文件列表。如果这个目录中的任何文数组中返回文件列表。如果这个目录中的任何文件本身是个目录件本身是个目录,这个方法并不递归枚举它的内这个方法并不递归枚举它的内容。容。武汉大学国际软件学院Objective-C 2.0程序设计16.1.3 枚举目录中的内容枚举目录中的内容v 代码清单代码清单16-4演示了如何在程序中使用这两个方法。演示了如何在程序中使用这两个

31、方法。#import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSString *path;NS *fm;NSDirectoryEnumerator *dirEnum;NSArray *dirArray;/ Need to create an instance of the fm = NS defaultManager;/ Get current working directory pathpath = fm cu

32、rrentDirectoryPath;/ Enumerate the directorydirEnum = fm enumeratorAtPath: path;NSLog (”Contents of %:”, path);while (path = dirEnum nextObject) != nil)NSLog (”%”, path);/ Another way to enumerate a directorydirArray = fm directoryContentsAtPath:fm currentDirectoryPath;NSLog (”Contents using directo

33、ryContentsAtPath:”);for ( path in dirArray ) NSLog (”%”, path);pool drain;return 0;武汉大学国际软件学院Objective-C 2.0程序设计16.1.3 枚举目录中的内容枚举目录中的内容v 程序程序16-4输出输出:Contents of /Users/stevekochan/mysrc/ch16:a.outdir1.mdir2.mnewdirnewdir/newdir/outputpath1.mtestfileContents using directoryContentsAtPath:a.outdir1.m

34、dir2.mnewdirpath1.mtestfile武汉大学国际软件学院Objective-C 2.0程序设计16.1.3 枚举目录中的内容枚举目录中的内容v让我们仔细看看以下代码内容让我们仔细看看以下代码内容:dirEnum = fm enumeratorAtPath: path;NSLog (”Contents of %:”, path;while (path = dirEnum nextObject) != nil)NSLog (”%”, path);通过向文件管理器对象(此处是通过向文件管理器对象(此处是fm)发送发送enumeratorAtPath:消息来开消息来开始目录的枚举过程

35、。始目录的枚举过程。 enumeratorAtPath:方法返回方法返回 了一个了一个NSDirectortyEnumerator对象对象,这个对象存储在这个对象存储在dirEnum中。中。 现在现在,毎次向该对象发送毎次向该对象发送nextObject消息时消息时,都会返回所枚举的目录中下一个文都会返回所枚举的目录中下一个文件的路径。没有其他文件可供枚举过程使用时件的路径。没有其他文件可供枚举过程使用时,会返回会返回nil。从代码清单从代码清单16-4的输出中的输出中,可以看到这两种枚举技术的不同之处。可以看到这两种枚举技术的不同之处。enumeratorAtPath:方法列出了方法列出了n

36、ewdir目录中的内容目录中的内容,而方法而方法directoryContentsAtPath:没有。如果没有。如果newdir包含子目录包含子目录,那那 么方法么方法enumeratorAtPath:也会枚举其中的内容。也会枚举其中的内容。 武汉大学国际软件学院Objective-C 2.0程序设计16.1.3 枚举目录中的内容枚举目录中的内容v前面提到过前面提到过,在代码清单在代码清单16-4中中while循环的执循环的执行过程中行过程中,通过对代码做如下更改通过对代码做如下更改,可以阻止任何可以阻止任何子目录中的枚举。子目录中的枚举。 while (path = dirEnum next

37、Object) != nil) NSLog (”%”, path);fm : path isDirectory: &flag;if (flag = YES)dirEnum skipDescendents;武汉大学国际软件学院Objective-C 2.0程序设计16.1.3 枚举目录中的内容枚举目录中的内容v这里这里,flag是一个是一个BOOL变量。如果指定的路径变量。如果指定的路径是目录是目录,则则:在在flag中存储中存储 yes,否则存储否则存储NO。v另外提醒一下另外提醒一下,无需像在这个程序中那样进行快无需像在这个程序中那样进行快速枚举速枚举,使用以下使用以下NSLog调用

38、可显示整个调用可显示整个 dirArray的内容的内容: NSLog (“%”, dirArray);武汉大学国际软件学院Objective-C 2.0程序设计2916.2 使用路径使用路径:NSPathUtilities.hvNSPathUtilities.h包含了包含了NSString的函数的函数和分类扩展和分类扩展,它允许你操作路径名。应该尽可能它允许你操作路径名。应该尽可能的使用这些函数的使用这些函数,以便使程序更独立于文件系统以便使程序更独立于文件系统结构以及特定文件和目录的位置。结构以及特定文件和目录的位置。v代码清单代码清单16-5 展示了如何使用展示了如何使用NSPathUti

39、lities.h提供的几种函数和方法。提供的几种函数和方法。武汉大学国际软件学院Objective-C 2.0程序设计16.2 使用路径使用路径:NSPathUtilities.h/ Some basic path operations#import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NSString *fName = ”path.m”;NS *fm;NSString *path, *temp

40、dir, *extension, *homedir, *fullpath;NSString *upath = ”stevekochan/progs/./ch16/./path.m”;NSArray *components;fm = NS defaultManager;/ Get the temporary working directorytempdir = NSTemporaryDirectory ();NSLog (”Temporary Directory is %”, tempdir);/ Extract the base directory from current directory

41、path = fm currentDirectoryPath;NSLog (”Base dir is %”, path lastPathComponent);/ Create a full path to the in current directoryfullpath = path stringByAppendingPathComponent: fName;NSLog (”fullpath to % is %”, fName, fullpath);武汉大学国际软件学院Objective-C 2.0程序设计16.2 使用路径使用路径:NSPathUtilities.h/ Get the ext

42、ensionextension = fullpath pathExtension;NSLog (”extension for % is %”, fullpath, extension);/ Get users home directoryhomedir = NSHomeDirectory ();NSLog (”Your home directory is %”, homedir);/ Divide a path into its componentscomponents = homedir pathComponents;for ( path in components)NSLog (”%”,

43、path);/ “Standardize” a pathNSLog (”% = %”, upath ,upath stringByStandardizingPath );pool drain;return 0;输出输出:Temporary Directory is /var/folders/HT/HTyGLvSNHTuNb6NrMuo7QE+TI/-Tmp-/Base dir is examplesfullpath to path.m is /Users/stevekochan/progs/examples/path.mextension for /Users/stevekochan/prog

44、s/examples/path.m is mYour home directory is /Users/stevekochan/Usersstevekochanstevekochan/progs/./ch16/./path.m = stevekochan/ch16/path.m武汉大学国际软件学院Objective-C 2.0程序设计3216.2 使用路径使用路径:NSPathUtilities.hv函数函数NSTemporaryDirectory返回系统中可返回系统中可以用来创建临时文件的目录路径名。以用来创建临时文件的目录路径名。v函数函数lastPathComponent用来从路径中提取

45、用来从路径中提取最后一个文件名。最后一个文件名。v函数函数StringByAppendingPathCompent方方法用于将文件名附加到路径的末尾。法用于将文件名附加到路径的末尾。v函数函数PathExtension方法给出了指定路径名的方法给出了指定路径名的文件扩展名。文件扩展名。v函数函数NSHomeDirectory返回当前用户的主目返回当前用户的主目录录v函数函数PathCompentents返回一个数组返回一个数组,包含指包含指定路径的每个组成部分定路径的每个组成部分武汉大学国际软件学院Objective-C 2.0程序设计3316.2.1常用的路径处理方法常用的路径处理方法武汉大

46、学国际软件学院Objective-C 2.0程序设计3416.2.1 常用的路径处理方法常用的路径处理方法 武汉大学国际软件学院Objective-C 2.0程序设计3516.2.2 复制文件和使用复制文件和使用NSProcessInfo类类 武汉大学国际软件学院Objective-C 2.0程序设计36武汉大学国际软件学院Objective-C 2.0程序设计3716.3 基本的文件操作基本的文件操作:NSv利用利用NS类提供的方法类提供的方法,允许更有效的使用文件。允许更有效的使用文件。v一般而言一般而言,我们处理文件时都要经历以下三个步骤我们处理文件时都要经历以下三个步骤: 1.打开文件

47、打开文件,并获取一个并获取一个NS对象对象,以便在后面的以便在后面的I/O才做中引用该文件才做中引用该文件 2.对打开的文件执行对打开的文件执行I/O操作操作 3.关闭文件关闭文件武汉大学国际软件学院Objective-C 2.0程序设计3816.3 基本的文件操作基本的文件操作:NS 武汉大学国际软件学院Objective-C 2.0程序设计16.3 基本的文件操作基本的文件操作:NSv 上表中并未列出获取上表中并未列出获取NS以用于标准输人、标准输出、标准错误和空设备的以用于标准输人、标准输出、标准错误和空设备的方法。方法。 它们的格式为它们的格式为,其中其中Device可以是可以是Sta

48、ndardlnput、StandardOutput, StandardError 或或 NullDevice。v 这里没有列出用干后台(也就是这里没有列出用干后台(也就是,异步)读取和写入的方法。异步)读取和写入的方法。v 应该注意到类并没有提供创建文件的功能应该注意到类并没有提供创建文件的功能.前面描述过前面描述过,必须使用必须使用 方法来创建方法来创建文件。因此文件。因此,方法方法filsHawdleFofWritingAtPath;和和:都都 假定文件已存在假定文件已存在,否则返回否则返回nil。对于这两个方法。对于这两个方法,文件的偏移董都设为文件的开始文件的偏移董都设为文件的开始,所

49、以都是所以都是 在文件的开始位置开始写人(或更新模式的读取)。另外在文件的开始位置开始写人(或更新模式的读取)。另外,如果在如果在UNIX系系统下编程应该注意统下编程应该注意, 打开用于读取的文件打开用于读取的文件,不要截断文件不要截断文件I如果想要这么做如果想要这么做,不不得不自己完成这项操作得不自己完成这项操作Av 代码清单代码清单16-7打开本章开始创建的原始打开本章开始创建的原始testfile文件文件,读取它的内容读取它的内容,并将并将其复制到名为其复制到名为 testout的文件中。的文件中。武汉大学国际软件学院Objective-C 2.0程序设计16.3 基本的文件操作基本的文

50、件操作:NS/ Some basic operations/ Assumes the existence of a “testfile”/ in the current working directory#import #import #import #import #import #import int main (int argc, char *argv)NSAutoreleasePool * pool = NSAutoreleasePool alloc init;NS *inFile, *outFile;NSData *buffer;/ Open the for readinginFil

51、e = NS : ”testfile”;if (in nil) NSLog (”Open of test reading failed”);return 1;/ Create the output if necessaryNS defaultManager create: ”testout”contents: nil attributes: nil;/ Now open out writingoutFile = NS : ”testout”;if (out nil) NSLog (”Open of testout for writing failed”);return 2;武汉大学国际软件学院

52、Objective-C 2.0程序设计16.3 基本的文件操作基本的文件操作:NS/ Truncate the output it may contain dataout: 0;/ Read the data from in write it to outFilebuffer = in;out: buffer;/ Close the two filesin;out;/ Verify the files contentsNSLog(”%”, NSString StringWithContentOfFile: ”testout”);pool drain;return 0;输出输出:This is

53、a test some data in it.Heres another line of data.And a third.武汉大学国际软件学院Objective-C 2.0程序设计16.3 基本的文件操作基本的文件操作:NSv 方法方法readDataToEndOfFile:毎次从文件中读取最多毎次从文件中读取最多UINT_MAX个字节的数据个字节的数据,这个量定义这个量定义 在头文件在头文件中中,并且在许多系统中值等于并且在许多系统中值等于FFFFFFFF16。这个值对于你编写的任何。这个值对于你编写的任何应用应用 程序而言程序而言,已经足够大了。还可以中断这项操作已经足够大了。还可以中断

54、这项操作,以执行少量读以执行少量读取和写入。利用方法取和写入。利用方法 readDataOfLength:甚至可以设置循环甚至可以设置循环,一一次在文件之间传输一缓冲区的字节。缓冲区的大小次在文件之间传输一缓冲区的字节。缓冲区的大小 可能是可能是8192 (8Kb)字节字节,.也可以是也可以是131072 (128Kb)字节字节,经常使用的是经常使用的是2的的乘方乘方,这是因为这是因为 底层的操作系统通常以块为单位执行底层的操作系统通常以块为单位执行I/O操作的操作的,而而块的大小一般为块的大小一般为2的乘方个字节的乘方个字节a可能要在可能要在 系统上试用不同的值系统上试用不同的值,以以查看哪

55、个值最适合。查看哪个值最适合。v 如果读取方法到达文件的末尾如果读取方法到达文件的末尾,并且没有读到任何数据并且没有读到任何数据,那么这个方法那么这个方法将返回一个空的将返回一个空的 NSData对象(也就是对象(也就是,缓冲区中没有字节)。可以缓冲区中没有字节)。可以对这个缓冲区应用对这个缓冲区应用length方法方法,并测试长度并测试长度 是否等于零是否等于零,以查看该文以查看该文件中是否还剩有数据可以读取。件中是否还剩有数据可以读取。武汉大学国际软件学院Objective-C 2.0程序设计16.3 基本的文件操作基本的文件操作:NSv 如果打开一个要更新的文件如果打开一个要更新的文件,则文件的偏移量要被设为文件的开始。则文件的偏移量要被设为文件的开始。通过在文件中定位通过在文件中定位 (seeking),可以更改偏移量可以更改偏移量,然后执行该文件的然后执行该文件的读写操作因此读写操作因此,要定位到文件(文件的句柄要定位到文件(文件的句柄 为为databaseHandle)的第的第10个字节个字节,可以编写如下消息表达式可以编写如下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论