版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第16章章 使用文件使用文件 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)2目錄目錄v16.1 管理文件和目錄管理文件和目錄:NSv16.2 使用路徑使用路徑:NSPathUtilities.hv16.3 基本的文件操作基本的文件操作:NS武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)316.1 管理文件和目錄管理文件和目錄:NSv對(duì)于對(duì)于NS,文件或目錄是使用文件的路徑名唯一的文件或目錄是使用文件的路徑名唯一的標(biāo)石的。每個(gè)路徑名都是一個(gè)標(biāo)石的。每個(gè)路徑名都是一個(gè)NSString對(duì)象對(duì)象,它它既可以是相對(duì)路徑名既可以是相對(duì)路徑名,也可以是完整路徑名。相也可以是完整路
2、徑名。相對(duì)路徑名是相對(duì)于當(dāng)前目錄的路徑名。所以對(duì)路徑名是相對(duì)于當(dāng)前目錄的路徑名。所以,文文件名件名copy1.m意味著當(dāng)前目錄中的文件意味著當(dāng)前目錄中的文件copy1.m。v完整路徑名完整路徑名,也稱為絕對(duì)路徑名也稱為絕對(duì)路徑名,以斜線以斜線/開始開始,斜斜線實(shí)際上就是一個(gè)目錄線實(shí)際上就是一個(gè)目錄,稱為根目錄。稱為根目錄。v這個(gè)特殊的代字符這個(gè)特殊的代字符用作用戶目錄的縮寫。用作用戶目錄的縮寫。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)416.1 管理文件和目錄管理文件和目錄:NS武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:
3、NSv每個(gè)文件方法都是對(duì)每個(gè)文件方法都是對(duì)NS對(duì)象的調(diào)用對(duì)象的調(diào)用,而而NS對(duì)象對(duì)象是通過向類發(fā)送一是通過向類發(fā)送一 條條defauItManager消息創(chuàng)消息創(chuàng)建的建的,如下所示如下所示: NS *fm; . fm = NS defaultManager;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:NSv例如例如,要從當(dāng)前目錄刪除名為要從當(dāng)前目錄刪除名為todolist的文件的文件,首首先要?jiǎng)?chuàng)建一個(gè)先要?jiǎng)?chuàng)建一個(gè)NS對(duì)象(如前對(duì)象(如前 面所示)面所示),然后調(diào)用然后調(diào)用remove方法方法,代碼如下代碼如下: fm remove: ”to
4、dolist” handler: nil; 可以測(cè)試返回結(jié)果可以測(cè)試返回結(jié)果,以確保成功地刪除該文件。以確保成功地刪除該文件。 if (fm remove: ”todolist” handler: nil = NO) NSLog (”Couldnt remove ”); return 1; 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:NSv 除了其他事情之外除了其他事情之外,屬性字典還允許你指定要?jiǎng)?chuàng)建的文件屬性字典還允許你指定要?jiǎng)?chuàng)建的文件的權(quán)限的權(quán)限,以便獲取或者更改現(xiàn)有以便獲取或者更改現(xiàn)有 文件的信息。對(duì)于文件創(chuàng)文件的信息。對(duì)于文件創(chuàng)建建
5、,如果將該參數(shù)指定為如果將該參數(shù)指定為nil,將會(huì)為該文件設(shè)置默認(rèn)權(quán)將會(huì)為該文件設(shè)置默認(rèn)權(quán)限。限。 :方法返回一個(gè)包含指定文件厲性的宇典。對(duì)于符號(hào)方法返回一個(gè)包含指定文件厲性的宇典。對(duì)于符號(hào)鏈接鏈接 (symbolic link), traverseLink:參數(shù)的值為參數(shù)的值為yes或或no。如果該文件是一個(gè)符號(hào)鏈接。如果該文件是一個(gè)符號(hào)鏈接,則指定則指定yes, 并并且返回鏈接到的文件厲性。如果指定且返回鏈接到的文件厲性。如果指定no,則返回鏈接本身則返回鏈接本身的屬性。的屬性。v 對(duì)于現(xiàn)有的文件對(duì)于現(xiàn)有的文件,屬性字典包括各種信息屬性字典包括各種信息,如文件的所有者、如文件的所有者、文件
6、大小、文件的創(chuàng)建曰期文件大小、文件的創(chuàng)建曰期, 等等。字典的每個(gè)屬性都可等等。字典的每個(gè)屬性都可以根據(jù)其鍵來提取以根據(jù)其鍵來提取,而所有鍵都定義在頭文件而所有鍵都定義在頭文件(Foundation/ NS中。例如中。例如,表示文件大小的鍵為表示文件大小的鍵為NS。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:NSv代碼清單代碼清單16-1展示了一些基本的文件操作。這展示了一些基本的文件操作。這個(gè)例子假設(shè)當(dāng)前目錄中存在一個(gè)名為個(gè)例子假設(shè)當(dāng)前目錄中存在一個(gè)名為testfile 的的文件文件,文件的內(nèi)容如下文件的內(nèi)容如下:/ 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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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. 這個(gè)程序首先測(cè)試這個(gè)程
12、序首先測(cè)試testfile文件是否存在。如果文件是否存在。如果存在存在,則復(fù)制則復(fù)制testfile文件文件,然后比較原文件然后比較原文件 和復(fù)和復(fù)制文件是否相等。經(jīng)驗(yàn)豐富的制文件是否相等。經(jīng)驗(yàn)豐富的UNIX用戶都知道用戶都知道,不能只通過為方法不能只通過為方法copyPath:toPath:和和 movePath:toPath:指定目標(biāo)目錄指定目標(biāo)目錄,就將文件就將文件移動(dòng)或復(fù)制到這個(gè)目錄中移動(dòng)或復(fù)制到這個(gè)目錄中,必須明確地指定目錄必須明確地指定目錄中的文件名。中的文件名。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:NSv movePat
13、h:toPath方法可以用來將文件從一個(gè)目錄移到另一個(gè)目方法可以用來將文件從一個(gè)目錄移到另一個(gè)目錄中(也可以用來移動(dòng)整個(gè)目錄)。如果兩個(gè)路徑引用同一目錄中錄中(也可以用來移動(dòng)整個(gè)目錄)。如果兩個(gè)路徑引用同一目錄中的文件(如本例所示)的文件(如本例所示),其結(jié)果僅僅是重新命名這個(gè)文件其結(jié)果僅僅是重新命名這個(gè)文件.因此因此,在代在代碼清單碼清單16-1中中,使用這個(gè)方法將文件使用這個(gè)方法將文件newfile重新命名為重新命名為newfile2。v 如表如表16-1所示所示,在執(zhí)行復(fù)制、重命名或移動(dòng)操作時(shí)在執(zhí)行復(fù)制、重命名或移動(dòng)操作時(shí),目標(biāo)文件不能是目標(biāo)文件不能是已存在的已存在的;否則否則,操操 作
14、將失敗。作將失敗。v newfile2的大小是通過使用的大小是通過使用:方法確定的。測(cè)試并確保返回了一個(gè)方法確定的。測(cè)試并確保返回了一個(gè)非非nil目錄目錄,然后使用然后使用NSDictionary類中的方法類中的方法objectForKey:,并用鍵并用鍵NS從字典中獲得文件的太小。最后從字典中獲得文件的太小。最后,顯示字典中表示文件大顯示字典中表示文件大小的整數(shù)值。小的整數(shù)值。 程序使用程序使用remove:方法來刪除原始文件方法來刪除原始文件testfile。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1 管理文件和目錄管理文件和目錄:NSv最后最后,使用使用NSStr
15、ing的的stringWithContentsOfFile:方法將文件方法將文件newfile2的內(nèi)容讀入一個(gè)宇符串對(duì)象的內(nèi)容讀入一個(gè)宇符串對(duì)象,然后這個(gè)然后這個(gè)對(duì)象作為參數(shù)傳遞給要顯示的對(duì)象作為參數(shù)傳遞給要顯示的NSLog。v在代碼清單在代碼清單16-1中中,測(cè)試每個(gè)文件操作以檢査它測(cè)試每個(gè)文件操作以檢査它是否成功。如果任何一個(gè)操作失敗是否成功。如果任何一個(gè)操作失敗,就會(huì)使用就會(huì)使用NSLog來記錄錯(cuò)誤來記錄錯(cuò)誤,并且程序?qū)⑼ㄟ^返回一個(gè)非并且程序?qū)⑼ㄟ^返回一個(gè)非零的退出狀態(tài)而退出。根據(jù)約定零的退出狀態(tài)而退出。根據(jù)約定,每個(gè)非每個(gè)非 零值郁零值郁表示一次程序失敗表示一次程序失敗,并且根據(jù)錯(cuò)誤類
16、型并且根據(jù)錯(cuò)誤類型,這個(gè)值都這個(gè)值都是唯一的。如果正在編寫命令行工具是唯一的。如果正在編寫命令行工具, 這將是一這將是一項(xiàng)有用的技術(shù)項(xiàng)有用的技術(shù),因?yàn)榭梢杂闪硪粋€(gè)程序來測(cè)試返因?yàn)榭梢杂闪硪粋€(gè)程序來測(cè)試返回值回值,比如從一個(gè)比如從一個(gè)shell腳本中測(cè)試。腳本中測(cè)試。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)1416.1.1 使用使用NSData類類v使用文件時(shí)使用文件時(shí),需要頻繁的將數(shù)據(jù)讀入一個(gè)臨時(shí)存需要頻繁的將數(shù)據(jù)讀入一個(gè)臨時(shí)存儲(chǔ)區(qū)儲(chǔ)區(qū),它通常稱為緩沖區(qū)。當(dāng)收集數(shù)據(jù)它通常稱為緩沖區(qū)。當(dāng)收集數(shù)據(jù),一遍隨后一遍隨后將這些數(shù)據(jù)輸出到文件中將這些數(shù)據(jù)輸出到文件中,通常也使用儲(chǔ)存區(qū)。通
17、常也使用儲(chǔ)存區(qū)。Foundation的的NSData類提供了一種簡(jiǎn)單的類提供了一種簡(jiǎn)單的方式方式,它用來設(shè)置緩沖區(qū)它用來設(shè)置緩沖區(qū),將文件的內(nèi)容讀入緩沖將文件的內(nèi)容讀入緩沖區(qū)區(qū),或?qū)⒕彌_區(qū)的內(nèi)容寫到一個(gè)文件。有一點(diǎn)不或?qū)⒕彌_區(qū)的內(nèi)容寫到一個(gè)文件。有一點(diǎn)不要奇怪要奇怪,對(duì)于對(duì)于32位應(yīng)用程序位應(yīng)用程序,NSDATA緩沖區(qū)最緩沖區(qū)最多可存儲(chǔ)多可存儲(chǔ)2GB的數(shù)據(jù)。對(duì)于的數(shù)據(jù)。對(duì)于64位應(yīng)用程序位應(yīng)用程序,最多最多可存儲(chǔ)可存儲(chǔ)8EB的數(shù)據(jù)。的數(shù)據(jù)。v正如你所期望的正如你所期望的,我們既可以定義不變緩沖區(qū)我們既可以定義不變緩沖區(qū),也也可以定義可變的緩沖區(qū)??梢远x可變的緩沖區(qū)。武漢大學(xué)國(guó)際軟件學(xué)院Obj
18、ective-C 2.0程序設(shè)計(jì)16.1.1 使用使用NSData類類v正如你所期望的正如你所期望的,我們既可以定義不可變緩沖區(qū)我們既可以定義不可變緩沖區(qū)(使用(使用NSData類)類),也可以定義可變的緩也可以定義可變的緩 沖區(qū)沖區(qū)(使用(使用NSMutableData類類)。在本章和后續(xù)幾。在本章和后續(xù)幾章將介紹這個(gè)類的方法。章將介紹這個(gè)類的方法。 代碼清單代碼清單16-2展示了展示了如何方便地將文件的內(nèi)容讀入內(nèi)存緩沖區(qū)。如何方便地將文件的內(nèi)容讀入內(nèi)存緩沖區(qū)。v這個(gè)程序讀取文件這個(gè)程序讀取文件newfile2的內(nèi)容的內(nèi)容,并將其寫人并將其寫人一個(gè)名為一個(gè)名為newfile3的新文件中。從某
19、種意義的新文件中。從某種意義 來來說說,它實(shí)現(xiàn)了文件的復(fù)制操作它實(shí)現(xiàn)了文件的復(fù)制操作,盡管它采取的方式盡管它采取的方式并不像方法并不像方法copyPath:toPath:handler那樣那樣直接。直接。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.1 使用使用NSData類類v程序程序16.2輸出輸出: was successful!vNSData的的ccmtentsAtPath:方法僅僅接受方法僅僅接受一個(gè)路徑名一個(gè)路徑名,并將指定文件的內(nèi)容讀人該方法創(chuàng)并將指定文件的內(nèi)容讀人該方法創(chuàng)建建 的存儲(chǔ)區(qū)的存儲(chǔ)區(qū),如果讀取成功如果讀取成功,這個(gè)方法將返回存儲(chǔ)這個(gè)方法將返回存儲(chǔ)區(qū)對(duì)象作為結(jié)果區(qū)對(duì)象作為結(jié)果,否則(例如否則(例如,該文件不存在該文件不存在 或者或者你不能讀取)你不能讀?。?將返回將返回nil。v方法方法createFUeAtPath:con
22、tents:attributes:創(chuàng)建了一個(gè)具有特定屬性(或者如果創(chuàng)建了一個(gè)具有特定屬性(或者如果attributes參數(shù)提供為參數(shù)提供為nil,則采用默認(rèn)的屬性值)則采用默認(rèn)的屬性值)的文件。然后的文件。然后,將指定的將指定的NSData對(duì)象內(nèi)容寫入對(duì)象內(nèi)容寫入這個(gè)文件中這個(gè)文件中, 在本例中在本例中,數(shù)據(jù)區(qū)包含前面讀取的文數(shù)據(jù)區(qū)包含前面讀取的文件內(nèi)容。件內(nèi)容。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)1816.1.2 使用目錄使用目錄v表表16-2總結(jié)了總結(jié)了NS提供的用于處理目錄的一些方提供的用于處理目錄的一些方法。其中大多數(shù)方法和用于普通文件的方法相同法。其中大多數(shù)方法
23、和用于普通文件的方法相同,如表如表16-1所示。所示。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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!武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.2 使用目錄使用目錄v代碼清單代碼清單16-3很容易理解。出于獲得信息的目很容易理解。出于獲得信息的目的的,首先獲取當(dāng)前的目錄路徑首先獲取當(dāng)前的目錄路徑,然后然后,在當(dāng)在當(dāng) 前目彔前目彔中創(chuàng)建一個(gè)名為中創(chuàng)建一個(gè)名為testdir的新目錄。然后使用的新目錄。然后使用movePath:toPath:handler方法將新目錄方
28、法將新目錄testdir 重命名為重命名為newdir。記住。記住,這個(gè)方法還可這個(gè)方法還可以用來將整個(gè)目錄結(jié)構(gòu)(這意味著包括目錄的內(nèi)以用來將整個(gè)目錄結(jié)構(gòu)(這意味著包括目錄的內(nèi)容)從容)從 文件系統(tǒng)的一個(gè)位置移動(dòng)到另一個(gè)位置。文件系統(tǒng)的一個(gè)位置移動(dòng)到另一個(gè)位置。v重命名新目錄之后重命名新目錄之后,程序使用程序使用changeCurrentDirectoryPath:方法將這方法將這個(gè)新目錄設(shè)置為當(dāng)前目錄。然后個(gè)新目錄設(shè)置為當(dāng)前目錄。然后,顯示當(dāng)前目錄顯示當(dāng)前目錄路徑路徑,以驗(yàn)證修改是否成功。以驗(yàn)證修改是否成功。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)2316.1.3 枚舉目錄
29、中的內(nèi)容枚舉目錄中的內(nèi)容v有時(shí)候需要獲得目錄的內(nèi)容列表。使用有時(shí)候需要獲得目錄的內(nèi)容列表。使用enumeratorAtPath:方法或者方法或者directoryContentsAtPath:方法方法,都可以完都可以完成枚舉過程。如果使用第一種方法成枚舉過程。如果使用第一種方法,一次可以枚一次可以枚舉指定目錄中的每個(gè)文件舉指定目錄中的每個(gè)文件,默認(rèn)情況下默認(rèn)情況下,如果其中如果其中一個(gè)文件為目錄一個(gè)文件為目錄,那么也會(huì)遞歸枚舉它的內(nèi)容。那么也會(huì)遞歸枚舉它的內(nèi)容。在這個(gè)過程中在這個(gè)過程中,通過像枚舉對(duì)象發(fā)送一條通過像枚舉對(duì)象發(fā)送一條skipDescendants消息消息,可以動(dòng)態(tài)的阻止遞歸可以動(dòng)
30、態(tài)的阻止遞歸過程過程,從而不再枚舉目錄中的內(nèi)容。從而不再枚舉目錄中的內(nèi)容。v對(duì)于對(duì)于directoryContentsAtPath:方法方法,使用使用這個(gè)方法??梢悦杜e指定目錄的內(nèi)容這個(gè)方法。可以枚舉指定目錄的內(nèi)容,并在一個(gè)并在一個(gè)數(shù)組中返回文件列表。如果這個(gè)目錄中的任何文數(shù)組中返回文件列表。如果這個(gè)目錄中的任何文件本身是個(gè)目錄件本身是個(gè)目錄,這個(gè)方法并不遞歸枚舉它的內(nèi)這個(gè)方法并不遞歸枚舉它的內(nèi)容。容。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.3 枚舉目錄中的內(nèi)容枚舉目錄中的內(nèi)容v 代碼清單代碼清單16-4演示了如何在程序中使用這兩個(gè)方法。演示了如何在程序中使用這兩個(gè)
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;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.3 枚舉目錄中的內(nèi)容枚舉目錄中的內(nèi)容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武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.3 枚舉目錄中的內(nèi)容枚舉目錄中的內(nèi)容v讓我們仔細(xì)看看以下代碼內(nèi)容讓我們仔細(xì)看看以下代碼內(nèi)容:dirEnum = fm enumeratorAtPath: path;NSLog (”Contents of %:”, path;while (path = dirEnum nextObject) != nil)NSLog (”%”, path);通過向文件管理器對(duì)象(此處是通過向文件管理器對(duì)象(此處是fm)發(fā)送發(fā)送enumeratorAtPath:消息來開消息來開始目錄的枚舉過程
35、。始目錄的枚舉過程。 enumeratorAtPath:方法返回方法返回 了一個(gè)了一個(gè)NSDirectortyEnumerator對(duì)象對(duì)象,這個(gè)對(duì)象存儲(chǔ)在這個(gè)對(duì)象存儲(chǔ)在dirEnum中。中。 現(xiàn)在現(xiàn)在,毎次向該對(duì)象發(fā)送毎次向該對(duì)象發(fā)送nextObject消息時(shí)消息時(shí),都會(huì)返回所枚舉的目錄中下一個(gè)文都會(huì)返回所枚舉的目錄中下一個(gè)文件的路徑。沒有其他文件可供枚舉過程使用時(shí)件的路徑。沒有其他文件可供枚舉過程使用時(shí),會(huì)返回會(huì)返回nil。從代碼清單從代碼清單16-4的輸出中的輸出中,可以看到這兩種枚舉技術(shù)的不同之處??梢钥吹竭@兩種枚舉技術(shù)的不同之處。enumeratorAtPath:方法列出了方法列出了n
36、ewdir目錄中的內(nèi)容目錄中的內(nèi)容,而方法而方法directoryContentsAtPath:沒有。如果沒有。如果newdir包含子目錄包含子目錄,那那 么方法么方法enumeratorAtPath:也會(huì)枚舉其中的內(nèi)容。也會(huì)枚舉其中的內(nèi)容。 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.3 枚舉目錄中的內(nèi)容枚舉目錄中的內(nèi)容v前面提到過前面提到過,在代碼清單在代碼清單16-4中中while循環(huán)的執(zhí)循環(huán)的執(zhí)行過程中行過程中,通過對(duì)代碼做如下更改通過對(duì)代碼做如下更改,可以阻止任何可以阻止任何子目錄中的枚舉。子目錄中的枚舉。 while (path = dirEnum next
37、Object) != nil) NSLog (”%”, path);fm : path isDirectory: &flag;if (flag = YES)dirEnum skipDescendents;武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.1.3 枚舉目錄中的內(nèi)容枚舉目錄中的內(nèi)容v這里這里,flag是一個(gè)是一個(gè)BOOL變量。如果指定的路徑變量。如果指定的路徑是目錄是目錄,則則:在在flag中存儲(chǔ)中存儲(chǔ) yes,否則存儲(chǔ)否則存儲(chǔ)NO。v另外提醒一下另外提醒一下,無需像在這個(gè)程序中那樣進(jìn)行快無需像在這個(gè)程序中那樣進(jìn)行快速枚舉速枚舉,使用以下使用以下NSLog調(diào)用
38、可顯示整個(gè)調(diào)用可顯示整個(gè) dirArray的內(nèi)容的內(nèi)容: NSLog (“%”, dirArray);武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)2916.2 使用路徑使用路徑:NSPathUtilities.hvNSPathUtilities.h包含了包含了NSString的函數(shù)的函數(shù)和分類擴(kuò)展和分類擴(kuò)展,它允許你操作路徑名。應(yīng)該盡可能它允許你操作路徑名。應(yīng)該盡可能的使用這些函數(shù)的使用這些函數(shù),以便使程序更獨(dú)立于文件系統(tǒng)以便使程序更獨(dú)立于文件系統(tǒng)結(jié)構(gòu)以及特定文件和目錄的位置。結(jié)構(gòu)以及特定文件和目錄的位置。v代碼清單代碼清單16-5 展示了如何使用展示了如何使用NSPathUti
39、lities.h提供的幾種函數(shù)和方法。提供的幾種函數(shù)和方法。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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);武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3216.2 使用路徑使用路徑:NSPathUtilities.hv函數(shù)函數(shù)NSTemporaryDirectory返回系統(tǒng)中可返回系統(tǒng)中可以用來創(chuàng)建臨時(shí)文件的目錄路徑名。以用來創(chuàng)建臨時(shí)文件的目錄路徑名。v函數(shù)函數(shù)lastPathComponent用來從路徑中提取
45、用來從路徑中提取最后一個(gè)文件名。最后一個(gè)文件名。v函數(shù)函數(shù)StringByAppendingPathCompent方方法用于將文件名附加到路徑的末尾。法用于將文件名附加到路徑的末尾。v函數(shù)函數(shù)PathExtension方法給出了指定路徑名的方法給出了指定路徑名的文件擴(kuò)展名。文件擴(kuò)展名。v函數(shù)函數(shù)NSHomeDirectory返回當(dāng)前用戶的主目返回當(dāng)前用戶的主目錄錄v函數(shù)函數(shù)PathCompentents返回一個(gè)數(shù)組返回一個(gè)數(shù)組,包含指包含指定路徑的每個(gè)組成部分定路徑的每個(gè)組成部分武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3316.2.1常用的路徑處理方法常用的路徑處理方法武漢大
46、學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3416.2.1 常用的路徑處理方法常用的路徑處理方法 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3516.2.2 復(fù)制文件和使用復(fù)制文件和使用NSProcessInfo類類 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)36武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3716.3 基本的文件操作基本的文件操作:NSv利用利用NS類提供的方法類提供的方法,允許更有效的使用文件。允許更有效的使用文件。v一般而言一般而言,我們處理文件時(shí)都要經(jīng)歷以下三個(gè)步驟我們處理文件時(shí)都要經(jīng)歷以下三個(gè)步驟: 1.打開文件
47、打開文件,并獲取一個(gè)并獲取一個(gè)NS對(duì)象對(duì)象,以便在后面的以便在后面的I/O才做中引用該文件才做中引用該文件 2.對(duì)打開的文件執(zhí)行對(duì)打開的文件執(zhí)行I/O操作操作 3.關(guān)閉文件關(guān)閉文件武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)3816.3 基本的文件操作基本的文件操作:NS 武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.3 基本的文件操作基本的文件操作:NSv 上表中并未列出獲取上表中并未列出獲取NS以用于標(biāo)準(zhǔn)輸人、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤和空設(shè)備的以用于標(biāo)準(zhǔn)輸人、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤和空設(shè)備的方法。方法。 它們的格式為它們的格式為,其中其中Device可以是可以是Sta
48、ndardlnput、StandardOutput, StandardError 或或 NullDevice。v 這里沒有列出用干后臺(tái)(也就是這里沒有列出用干后臺(tái)(也就是,異步)讀取和寫入的方法。異步)讀取和寫入的方法。v 應(yīng)該注意到類并沒有提供創(chuàng)建文件的功能應(yīng)該注意到類并沒有提供創(chuàng)建文件的功能.前面描述過前面描述過,必須使用必須使用 方法來創(chuàng)建方法來創(chuàng)建文件。因此文件。因此,方法方法filsHawdleFofWritingAtPath;和和:都都 假定文件已存在假定文件已存在,否則返回否則返回nil。對(duì)于這兩個(gè)方法。對(duì)于這兩個(gè)方法,文件的偏移董都設(shè)為文件的開始文件的偏移董都設(shè)為文件的開始,所
49、以都是所以都是 在文件的開始位置開始寫人(或更新模式的讀取)。另外在文件的開始位置開始寫人(或更新模式的讀?。?。另外,如果在如果在UNIX系系統(tǒng)下編程應(yīng)該注意統(tǒng)下編程應(yīng)該注意, 打開用于讀取的文件打開用于讀取的文件,不要截?cái)辔募灰財(cái)辔募蘒如果想要這么做如果想要這么做,不不得不自己完成這項(xiàng)操作得不自己完成這項(xiàng)操作Av 代碼清單代碼清單16-7打開本章開始創(chuàng)建的原始打開本章開始創(chuàng)建的原始testfile文件文件,讀取它的內(nèi)容讀取它的內(nèi)容,并將并將其復(fù)制到名為其復(fù)制到名為 testout的文件中。的文件中。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)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 (”O(jiān)pen 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 (”O(jiān)pen of testout for writing failed”);return 2;武漢大學(xué)國(guó)際軟件學(xué)院
52、Objective-C 2.0程序設(shè)計(jì)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.武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.3 基本的文件操作基本的文件操作:NSv 方法方法readDataToEndOfFile:毎次從文件中讀取最多毎次從文件中讀取最多UINT_MAX個(gè)字節(jié)的數(shù)據(jù)個(gè)字節(jié)的數(shù)據(jù),這個(gè)量定義這個(gè)量定義 在頭文件在頭文件中中,并且在許多系統(tǒng)中值等于并且在許多系統(tǒng)中值等于FFFFFFFF16。這個(gè)值對(duì)于你編寫的任何。這個(gè)值對(duì)于你編寫的任何應(yīng)用應(yīng)用 程序而言程序而言,已經(jīng)足夠大了。還可以中斷這項(xiàng)操作已經(jīng)足夠大了。還可以中斷
54、這項(xiàng)操作,以執(zhí)行少量讀以執(zhí)行少量讀取和寫入。利用方法取和寫入。利用方法 readDataOfLength:甚至可以設(shè)置循環(huán)甚至可以設(shè)置循環(huán),一一次在文件之間傳輸一緩沖區(qū)的字節(jié)。緩沖區(qū)的大小次在文件之間傳輸一緩沖區(qū)的字節(jié)。緩沖區(qū)的大小 可能是可能是8192 (8Kb)字節(jié)字節(jié),.也可以是也可以是131072 (128Kb)字節(jié)字節(jié),經(jīng)常使用的是經(jīng)常使用的是2的的乘方乘方,這是因?yàn)檫@是因?yàn)?底層的操作系統(tǒng)通常以塊為單位執(zhí)行底層的操作系統(tǒng)通常以塊為單位執(zhí)行I/O操作的操作的,而而塊的大小一般為塊的大小一般為2的乘方個(gè)字節(jié)的乘方個(gè)字節(jié)a可能要在可能要在 系統(tǒng)上試用不同的值系統(tǒng)上試用不同的值,以以查看哪
55、個(gè)值最適合。查看哪個(gè)值最適合。v 如果讀取方法到達(dá)文件的末尾如果讀取方法到達(dá)文件的末尾,并且沒有讀到任何數(shù)據(jù)并且沒有讀到任何數(shù)據(jù),那么這個(gè)方法那么這個(gè)方法將返回一個(gè)空的將返回一個(gè)空的 NSData對(duì)象(也就是對(duì)象(也就是,緩沖區(qū)中沒有字節(jié))??梢跃彌_區(qū)中沒有字節(jié))。可以對(duì)這個(gè)緩沖區(qū)應(yīng)用對(duì)這個(gè)緩沖區(qū)應(yīng)用length方法方法,并測(cè)試長(zhǎng)度并測(cè)試長(zhǎng)度 是否等于零是否等于零,以查看該文以查看該文件中是否還剩有數(shù)據(jù)可以讀取。件中是否還剩有數(shù)據(jù)可以讀取。武漢大學(xué)國(guó)際軟件學(xué)院Objective-C 2.0程序設(shè)計(jì)16.3 基本的文件操作基本的文件操作:NSv 如果打開一個(gè)要更新的文件如果打開一個(gè)要更新的文件,則文件的偏移量要被設(shè)為文件的開始。則文件的偏移量要被設(shè)為文件的開始。通過在文件中定位通過在文件中定位 (seeking),可以更改偏移量可以更改偏移量,然后執(zhí)行該文件的然后執(zhí)行該文件的讀寫操作因此讀寫操作因此,要定位到文件(文件的句柄要定位到文件(文件的句柄 為為databaseHandle)的第的第10個(gè)字節(jié)個(gè)字節(jié),可以編寫如下消息表達(dá)式可以編寫如下
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年外研版三年級(jí)起點(diǎn)八年級(jí)科學(xué)上冊(cè)月考試卷含答案
- 2025年人教版拓展型課程化學(xué)下冊(cè)月考試卷含答案
- 二零二五年度企業(yè)融資合同-明確利率規(guī)定與利息支付方式4篇
- 2024年高中生物 專題1 基因工程 1.2 第1課時(shí) 目的基因獲取和基因表達(dá)載體的構(gòu)建說課稿 新人教版選修3
- 二零二五年度大門原材料供應(yīng)鏈管理合同4篇
- 二零二五年度賣房墊資貸款與房產(chǎn)抵押協(xié)議3篇
- 二零二五年車抵押貸款續(xù)貸合同樣本3篇
- 二零二五年度美縫施工項(xiàng)目后期維護(hù)與保養(yǎng)合同4篇
- 二零二五年度建筑材料出口貿(mào)易合同(2025版)4篇
- 2025年度出借業(yè)務(wù)合規(guī)性審查與法律風(fēng)險(xiǎn)防范合同4篇
- 2024年??谑羞x調(diào)生考試(行政職業(yè)能力測(cè)驗(yàn))綜合能力測(cè)試題及答案1套
- 六年級(jí)數(shù)學(xué)質(zhì)量分析及改進(jìn)措施
- 一年級(jí)下冊(cè)數(shù)學(xué)口算題卡打印
- 2024年中科院心理咨詢師新教材各單元考試題庫(kù)大全-下(多選題部分)
- 真人cs基于信號(hào)發(fā)射的激光武器設(shè)計(jì)
- 【閱讀提升】部編版語(yǔ)文五年級(jí)下冊(cè)第三單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 四年級(jí)上冊(cè)遞等式計(jì)算練習(xí)200題及答案
- 法院后勤部門述職報(bào)告
- 2024年國(guó)信證券招聘筆試參考題庫(kù)附帶答案詳解
- 道醫(yī)館可行性報(bào)告
- 視網(wǎng)膜中央靜脈阻塞護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論