oc文件操作
從文件裏讀內容,寫內容到文件裏,做得字典,fopen fread fwrite fgets
1.對文件本身的操作(運行文件就能創建,移動,拷貝, 刪除文件)
NSFileManger //文件管理器
NSFileManager * fm = [NSFileManager defaultManager];
//用這個類方法創建filemanager,因爲這樣創建是單例(只有一個),每個程序只需要一個文件管理器。
NSString * path = [[NSBundle mainBundle]pathForResource:@"map" ofType:@"txt"];
//查找某目錄下的目錄
NSError * error;
NSArray * array=[fm contentsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@",error);
}
//如果發生錯誤,該方法會創建一個NSError對象,將error指向NSError對象。錯誤的原因在description方法中。如果沒錯,該方法創建一堆字符串,是該目錄下所有文件及子目錄的名字。又創建一個數組裝這些字符串,返回數組地址。contents(內容)directory(目錄)
int i;
for (i=0; i<array.count; i++) {
NSLog(@"%@",[array objectAtIndex:i]);
}
//淺度遍歷
//深度遍歷,不僅查看指定路勁下得文件和子目錄,而且查看子目錄下得內容,知道沒有子目錄。
NSArray *array2=[fm subpathsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@",error);
}
// int i;
NSLog(@"%@",array2);
//創建文件夾
[fm createDirectoryAtPath:[NSString stringWithFormat:@"%@/Middle/dir",PATH] withIntermediateDirectories:YES attributes: nil error:&error];
if (error) {
NSLog(@"%@",error);
exit(0);
}
//第二個參數表示中間目錄是否創建,如果填NO,則缺失中間目錄時,報錯,如果填YES,則自動創建中間目錄。
//第三個參數表示文件屬性,通常填nil,表示默認屬性。
//創建文件
NSString * str=@"節後綜合徵";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
BOOL ret=[fm createFileAtPath:[NSString stringWithFormat:@"%@/file",PATH] contents:data attributes:nil]
//data 是c中的buf,用來暫時存儲信息。NSLog(@“%S”,(char *)data.bytes);
//第二個參數此傲視文件內容,如果問價你創建時,不想寫入內容,傳nil,它的類型是NSdata
//nsdata是緩存類,用來將數據寫入文件,或從文件獲取數據,任何類的對象都能轉成NSDATA,只不過要使用協議
//字符串轉成NSDate,需要轉成編碼格式,UTF8是mac下得默認格式編碼,對中文支持很好。
if (!ret) {
NSLog(@"文件創建失敗");
exit(0);
}
//刪除文件或者目錄
[fm removeItemAtPath:[NSString stringWithFormat:@"%@/Middle",PATH] error:&error];
if (error) {
NSLog(@"%@",error);
exit(0);
}
//文件複製
#define PATH @"/Users/qianfeng/desktop/1314/8.4-oc文件操作/file"
#define DST_PATH @"/Users/qianfeng/desktop/1314/8.4-oc文件操作/dir/file"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSFileManager * fm = [NSFileManager defaultManager];
NSError * error=nil;
[fm copyItemAtPath:PATH toPath:DST_PATH error:&error];
if(error)
{
NSLog(@"%@",error);
exit(0);
}
//文件剪切(remove 文件刪除)
[fm moveItemAtPath:PATH toPath:DST_PATH error:&error];
if(error)
{
NSLog(@"%@",error);
exit(0);
}
//獲得文件屬性
NSDictionary * dict = [fm attributesOfItemAtPath:PATH error:&error];
//獲得當前工程下得文件路徑
NSString * path = [[NSBundle mainBundle]pathForResource:@"字典" ofType:@"txt"];
2.對文件內容的操作
NSFileHandle //文件句柄
//讀到句尾
NSFileHandle * fh = [NSFileHandle fileHandleForReadingAtPath:PATH];
//以只讀方式打開文件,生成文件句柄。從句柄裏讀,就是從文件裏讀。
NSData * data=[fh readDataToEndOfFile];
//讀到文件尾
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//data轉換成string類型
NSLog(@"%@",str);
//讀指定長度
NSData *data2=[fh readDataOfLength:6];
NSString *str2=[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str2);
data2=[fh readDataOfLength:6];
NSString *str3 =[[NSString alloc]initWithData:data2 encoding:NSUTF8StringEncoding];
NSLog(@"%@",str3);
第二次讀取會接着第一次後面讀。
//寫
[fh writeData:[@"花心大蘿蔔"dataUsingEncoding:NSUTF8StringEncoding]];
//從第一個字節開始覆蓋。
如果要清空原文件
[fh truncateFileAtOffset:0];
//階段至0字節。
[fh seekToEndofFile];
//將讀寫指針,至於文件尾
同一次打開文件,讀,接着讀,寫,接着寫!
NSFileHandle * fh = [NSFileHandle fileHandleForWritingAtPath:PATH];
//以只寫方式打開文件,生成文件句柄
[fh truncateFileAtOffset:0];
//階段至0字節。
[fh seekToEndOfFile];
//將讀寫指針至於文件尾。
[fh writeData:[@"花心大蘿蔔"dataUsingEncoding:NSUTF8StringEncoding]];
//從第一個字節開始覆蓋。
[fh writeData:[@"花心大蘿蔔"dataUsingEncoding:NSUTF8StringEncoding]];
iphone沙箱模型的有四個文件夾,分別是什麼,永久數據存儲一般放在什麼位置,得到模擬器的路徑的簡單方式是什麼.
documents,tmp,app,Library。
(NSHomeDirectory()),
手動保存的文件在documents文件裏
Nsuserdefaults保存的文件在tmp文件夾裏
1、Documents 目錄:您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。
2、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啓動。
3、Library
目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啓動過程中需要的信息。
4、tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啓動過程中不需要的信息。
獲取這些目錄路徑的方法:
1,獲取家目錄路徑的函數:
NSString *homeDir = NSHomeDirectory();
2,獲取Documents目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,獲取Caches目錄路徑的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,獲取tmp目錄路徑的方法:
NSString *tmpDir = NSTemporaryDirectory();
5,獲取應用程序程序包中資源文件路徑的方法:
例如獲取程序包中一個圖片資源(apple.png)路徑的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
代碼中的mainBundle類方法用於返回一個代表應用程序包的對象。
iphone沙盒(sandbox)中的幾個目錄獲取方式:
[cpp] view plaincopy
- // 獲取沙盒主目錄路徑
- NSString *homeDir = NSHomeDirectory();
- // 獲取Documents目錄路徑
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *docDir = [paths objectAtIndex:0];
- // 獲取Caches目錄路徑
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- NSString *cachesDir = [paths objectAtIndex:0];
- // 獲取tmp目錄路徑
- NSString *tmpDir = NSTemporaryDirectory();
[cpp] view plaincopy
- // 獲取當前程序包中一個圖片資源(apple.png)路徑
- NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
- UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
例子:
NSFileManager* fm=[NSFileManager defaultManager];
if(![fm fileExistsAtPath:[self dataFilePath]]){
//下面是對該文件進行制定路徑的保存
[fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
//取得一個目錄下得所有文件名
NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
//讀取某個文件
NSData *data = [fm contentsAtPath:[self dataFilePath]];
//或者
NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
}
1、其中得 app root 可以用 NSHomeDirectory()
訪問到;
2、Documents 目錄就是我們可以用來寫入並保存文件得地方,一般可通過:
1. de style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left:
2. 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">
3. NSArray *paths = NSSearchPa
4. thForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
5.
6. de>
7. de style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px;
8. margin-top: 0px; margin-right: 0px; margin-bottom:
9. 0px; margin-left: 0px; ">NSString *documentsDirectory = [paths objectAtIndex:0];
10. de>
得到。
3、tmp 目錄我們可以在裏面寫入一些程序運行時需要用得數據,裏面寫入得數據在程序退出後會沒有。可以通過
1. NSString *NSTemporaryDirectory(void);
方法得到;
4、文件一些主要操作可以通過NSFileManage 來操作,可以通過 [NSFileManger defaultManger]
得到它得實例。
相關得一些操作:
創建一個目錄:比如要在Documents下面創建一個test目錄,
1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2. NSString *documentsDirectory = [paths objectAtIndex:0];
3. NSLog(@”%@”,documentsDirectory);
4. NSFileManager *fileManage = [NSFileManager defaultManager];
5. NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@“test”];
6. BOOL ok = [fileManage createDirectoryAtPath:myDirectory attributes:nil];
取得一個目錄下得所有文件名:(如上面的myDirectory)可用
1. NSArray *file = [fileManager subpathsOfDirectoryAtPath: myDirectory error:nil];
或
1. NSArray *files = [fileManager subpathsAtPath: myDirectory ];
讀取某個文件:
1. NSData *data = [fileManger contentsAtPath:myFilePath];//myFilePath
是包含完整路徑的文件名
或直接用NSData 的類方法:
1. NSData *data = [NSData dataWithContentOfPath:myFilePath];
保存某個文件:
可以用 NSFileManager的
1. - (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
1. - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
2. - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;
小結:詳解iPhone開發中文件讀寫教程的內容介紹完了,希望通過本文的學習能對你有所幫助!
iPhone文件系統NSFileManager講解是本文要介紹的內容,主要是通過iphone文件系統來學習NSFileManager的使用方法,具體內容來看本文詳解。
iPhone文件系統:創建、重命名以及刪除文件,NSFileManager中包含了用來查詢單詞庫目錄、創建、重命名、刪除目錄以及獲取/設置文件屬性的方法(可讀性,可編寫性等等)。
每個程序都會有它自己的沙盒,通過它你可以閱讀/編寫文件。寫入沙盒的文件在程序的進程中將會保持穩定,即便實在程序更新的情況下。
如下所示,你可以在沙盒中定位文件目錄:
1. //對於錯誤信息
2. NSError *error;
3. // 創建文件管理器
4. NSFileManager *fileMgr = [NSFileManagerdefaultManager];
5. //指向文件目錄
6. NSString *documentsDirectory= [NSHomeDirectory()
7. stringByAppendingPathComponent:@"Documents"];
8.
9. //創建一個目錄
10. [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];
創建一個文件
現在我們已經有了文件目錄,我們就能使用這個路徑在沙盒中創建一個新文件並編寫一段代碼:
1. // File we want to create in the documents directory我們想要創建的文件將會出現在文件目錄中
2. // Result is: /Documents/file1.txt結果爲:/Documents/file1.txt
3. NSString *filePath= [documentsDirectory
4. stringByAppendingPathComponent:@"file1.txt"];
5. //需要寫入的字符串
6. NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";
7. //寫入文件
8. [str writeToFile:filePath atomically:YES
9. encoding:NSUTF8StringEncoding error:&error];
10. //顯示文件目錄的內容
11. NSLog(@"Documentsdirectory: %@",
12. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
我們爲想要創建的文件構建一條路徑(file1.txt),初始化一個字符串來寫入文件,並列出目錄。最後一行顯示了在我們創建文件之後出現在文件目錄下的一個目錄列表:
對一個文件重命名
想要重命名一個文件,我們需要把文件移到一個新的路徑下。下面的代碼創建了我們所期望的目標文件的路徑,然後請求移動文件以及在移動之後顯示文件目錄。
1. //通過移動該文件對文件重命名
2. NSString *filePath2= [documentsDirectory
3. stringByAppendingPathComponent:@"file2.txt"];
4. //判斷是否移動
5. if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
6. NSLog(@"Unable to move file: %@", [error localizedDescription]);
7. //顯示文件目錄的內容
8. NSLog(@"Documentsdirectory: %@",
9. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
在移動了文件之後,輸出結果應該如下圖所示:
刪除一個文件
爲了使這個技巧完整,讓我們再一起看下如何刪除一個文件:
1. //在filePath2中判斷是否刪除這個文件
2. if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
3. NSLog(@"Unable to delete file: %@", [error localizedDescription]);
4. //顯示文件目錄的內容
5. NSLog(@"Documentsdirectory: %@",
6. [fileMgr contentsOfDirectoryAtPath:documentsDirectoryerror:&error]);
一旦文件被刪除了,正如你所預料的那樣,文件目錄就會被自動清空:
這些示例能教你的,僅僅只是文件處理上的一些皮毛。想要獲得更全面、詳細的講解,你就需要掌握NSFileManager文件的知識。
在開發iPhone程序時,有時候要對文件進行一些操作。而獲取某一個目錄中的所有文件列表,是基本操作之一。通過下面這段代碼,就可以獲取一個目錄內的文件及文件夾列表。
1. NSFileManager *fileManager = [NSFileManager defaultManager];
2. //在這裏獲取應用程序Documents文件夾裏的文件及文件夾列表
3. NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
4. NSString *documentDir = [documentPaths objectAtIndex:0];
5. NSError *error = nil;
6. NSArray *fileList = [[NSArray alloc] init];
7. //fileList便是包含有該文件夾下所有文件的文件名及文件夾名的數組
8. fileList = [fileManager contentsOfDirectoryAtPath:documentDir error:&error];
以下這段代碼則可以列出給定一個文件夾裏的所有子文件夾名
1. NSMutableArray *dirArray = [[NSMutableArray alloc] init];
2. BOOL isDir = NO;
3. //在上面那段程序中獲得的fileList中列出文件夾名
4. for (NSString *file in fileList) {
5. NSString *path = [documentDir stringByAppendingPathComponent:file];
6. [fileManager fileExistsAtPath:path isDirectory:(&isDir)];
7. if (isDir) {
8. [dirArray addObject:file];
9. }
10. isDir = NO;
11. }
12. NSLog(@"Every Thing in the dir:%@",fileList);
13. NSLog(@"All folders:%@",dirArray);
+ (NSString *)pathWithComponents(NSArray *)components
根據components中的元素來構建路徑.
- (NSArray *)pathComponents
解析路徑,返回構成路徑的各個部分.
- (NSString *)lastPathComponent
提取路徑中的最後一個組成部分
- (NSString *)pathExtension
從路徑中最後一個組成部分中提取擴展名
- (NSString *)stringByAppendingPathComponent(NSString *)path
將path添加到現有路徑末尾
- (NSString *)stringByAppendingPathExtension(NSString *)ext
將指定的擴展名添加到現有路徑的最後一個組成部分上
- (NSString *)stringByDeletingLastPathComponent
刪除路徑中的最後一個組成部分
- (NSString *)stringByDeletingPathExtension
從文件的最後一部分刪除擴展名
- (NSString *)stringByExpandingTildeInPath
將路徑中的代字符擴展成用戶主目錄(~)或指定用戶的主目錄(~user)
- (NSString *)stringByResolvingSymlinksInPath
嘗試解析路徑中的符號鏈接
- (NSString *)stringByStandardizingPath
解析路徑中的~,(..)父目錄,(.)當前目錄和符號鏈接來標準化路徑.
常用的NSProcessInfo類(進程相關)
+ (NSProcessInfo *)processInfo
返回當前進程信息
- (NSArray *)arguments
以NSString對象數字的形式返回當前進程的參數
- (NSDictionary *)environment
返回變量/值對字典,以描述當前的環境變量(比如PATH等等)
- (int)processIdentifier
返回進程PID
- (NSString *)processName
返回當前正在執行的進程名稱
- (NSString *)globallyUniqueString
每次調用該方法時,都會返回不同的單值字符串,可以生成臨時文件名
- (NSString *)hostName
返回主機系統名
-(NSUInteger)operatingSystem
返回表示操作系統的數字
- (NSString *)operatingSystemName
返回操作系統的名稱
- (NSString *)operatingSystemVersionString
返回操作系統版本
- (void)setProcessNameNSString *)name
修改當前進程名(謹慎使用)
基本文件操作類: NSFileHandle
NSFileHandle類沒有提供創建文件的方法,所以要創建文件需要使用FileManager方法來創建, NSFileHandle類中的文件操作方法都是假定文件都是存在的,如果不存在,則返回nil.
常用的NSFileHandle方法:
+ (id)fileHandleForReadingAtPathNSString *)path
打開一個文件準備讀取
+ (id)fileHandleForWritingAtPathNSString *)path
打開一個文件準備寫入
+ (id)fileHandleForUpdatingAtPathNSString *)path
打開一個文件準備更新(讀取和寫入)
- (NSData *)availableData
從設備或者通道返回可用的數據
- (NSData *)readDataToEndOfFile
讀取其餘的數據直到文件的末尾(最大值爲無符號整形的最大值)
- (NSData *)readDataOfLengthNSUInteger)length
從文件讀取指定字節數的內容
- (void)writeDataNSData *)data
將data寫入文件
- (unsigned long long)offsetInFile
獲取當前文件的偏移量
- (void)seekToFileOffsetunsigned long long)offset
設置當前文件的偏移量
- (unsigned long long)seekToEndOfFile
將當前文件的偏移量定位到文件的末尾
- (void)truncateFileAtOffset:(unsigned long long)offset
將文件的長度設置爲offset字節(如需要,可填充內容)
- (void)closeFile
關閉文件
-(bool) fileHandleForReadingAtPath
文件是否可讀
-(void) fileHandleForWritingAtPath
文件是否可寫