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