en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

8.15.2013

使用 NSFileManager 做簡單的檔案操作

 

在 iOS SDK 中要對檔案操作免不了要使用到 NSFileManager Class,這個類別提供好用的檔案操作函式,下面就來看看如何使用 NSFileManager 對檔案進行操作。


取得目錄
在開始對檔案操作之前,我們要先知道檔案存放的位置,在 iOS 中提供幾個可供存放檔案的地方,像是 Home、Documents、Library、Tmp 和 Cache 等等資料夾,你可以從以下程式碼獲得取得這些資料夾路徑的方法。
//Home Path
NSString *homePath = NSHomeDirectory();

//Document Path
NSArray *docDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [docDirectory objectAtIndex:0];

//Library Path
NSArray *libDirectory = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [libDirectory objectAtIndex:0];

//Tmp Path
NSString *tmpPath = NSTemporaryDirectory();

//Cache Path
NSArray *cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cacPath objectAtIndex:0];

  • Documents
這是最常被用來存放檔案的資料夾,也是 Apple 官方建議存放檔案的資料夾,iTunes 備份時會連同此資料夾做備份。
  • Library
預設是用來存放程式的相關資訊,像是設定或是執行狀態等等。
  • Tmp
暫存用的資料夾,當應用程式結束時,此資料夾也會一並銷燬,不會備份,當系統需要而外資源時,也會優先刪除該資料夾內的東西。
  • Cache
位於 Library 中,是 Library 內的子資料夾,此資料夾並不會被 iTunes 備份。
    ps:下面我們都會以 Documents 資料夾來做檔案操作的示範。


    建立新資料夾與檔案
    在這一部分,我們會在 Documents 中建立一個新資料夾,並在其中建立空白的檔案等待之後做覆寫,首先是建立新資料夾。
    //製作新資料夾的路徑
    NSString *newFolderPath = [documentPath stringByAppendingPathComponent:@"新資料夾"];

    //建立新資料夾
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager createDirectoryAtPath:newFolderPath withIntermediateDirectories:YES attributes:nil error:nil])
        NSLog(@"新資料夾建立成功");

    建立檔案的原理與資料夾相同,唯一的差別是使用 createFileAtPath:contents: attributes: 方法函式來建立檔案。
    //製作新檔案的路徑
    NSString *newFilePath = [newFolderPath stringByAppendingPathComponent:@"iOS.txt"];

    //建立空白新檔案
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager createFileAtPath:newFilePath contents:nil attributes:nil])
        NSLog(@"新檔案建立成功");


    對檔案寫入資料
    在上述部分我們已經在資料夾中建立了一個空白的檔案,在這部份我們會先取得該檔案的路徑,之後才會進行覆寫的回存的動作。
    //寫入內容
    NSString *FileContent = @"Furnace Digital iOS 程式設計中文學習網站";

    if ([FileContent writeToFile:newFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil])
        NSLog(@"檔案覆寫成功");

    實際檢視所操作的檔案


    檔案的複製、移動與刪除
    在複製、移動與刪除方面,與上述並沒有太大的不同,同樣都是需要先取得檔案的路徑與目標路徑,即可使用下列函式來實作。
    //複製
    [fileManager copyItemAtPath:@"目前路徑" toPath:@"目標路徑" error:nil]

    //移動
    [fileManager moveItemAtPath:@"目前路徑" toPath:@"目標路徑" error:nil]

    //刪除
    [fileManager removeItemAtPath:@"檔案路徑" error:nil]


    取得檔案相關屬性
    檔案包含許多的相關屬性,像是檔案大小、位置、建立與修改日期、狀態等等,都可以使用 NSDictionary 來取得目標檔案的相關屬性。
    NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:newFilePath error:nil];

    for (id key in fileAttributes) {
        NSLog(@"key: %@, value: %@ \n", key, [fileAttributes objectForKey:key]);
    }

    iOS.txt 檔案的部份屬性一覽


    其他輔助判斷
    你可以使用下列程式碼,幫助你在實作上判斷檔案使否可以讀寫、執行或是存在。
    //判斷檔案是否可讀寫、執行和存在
    [fileManager isReadableFileAtPath:@"檔案路徑"]
    [fileManager isWritableFileAtPath:@"檔案路徑"]
    [fileManager isExecutableFileAtPath:@"檔案路徑"]
    [fileManager fileExistsAtPath:@"檔案路徑"]


    其他應用
    在這部份雖與 NSFileManager 沒什麼關係,但是同樣涉及檔案的操作,下面我們將使用程式碼動態產生一個 index.html 檔案,並將它存放於 Documents 資料夾中。
    //建立檔案內容
    NSMutableString *myHTML = [[NSMutableString alloc] init];
    [myHTML appendFormat:@"<HTML><head><title>Furnace Digital iOS</title></head>"];
    [myHTML appendFormat:@"<body bgcolor='#222222'>"];
    [myHTML appendFormat:@"<font face='Arial' color='#ccffcc' size='64'>NSFileManager DEMO.</font>"];
    [myHTML appendFormat:@"</body>"];

    //取得 Document Path
    NSArray *docDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [docDirectory objectAtIndex:0];

    //取得檔案路徑
    NSString *newFilePath = [documentPath stringByAppendingPathComponent:@"index.html"];

    //寫入
    [myHTML writeToFile:newFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil];

    index.html 的執行結果








    2 則留言: