1. 程式人生 > >iOS之檔案管理

iOS之檔案管理

沙盒

  • iOS的沙盒機制
    1、iOS的應用程式只能對自己建立的檔案系統讀取檔案,這個獨立、封閉、安全的空間,叫做沙盒。它一般存放著程式包檔案(可執行檔案)、圖片、音訊、視訊、plist檔案、sqlite資料庫以及其他檔案;
    2、每個應用程式都有自己的獨立的儲存空間(沙盒);
    3、一般來說,應用程式之間是不可以互相訪問沙盒的;
    4、模擬器的沙盒位置路徑:/User/userName/Library/Application Support/iPhone Simulator

  • 沙盒的構成:當建立應用程式的時候,在每個沙盒中都含有三個檔案,分別是Document、Library和temp。
    1、Document:一般需要持久的資料都放在此目錄中,可以在當中新增子資料夾,iTunes備份和恢復的時候,會包括此目錄;
    2、Library:設定程式的預設設定和其他的狀態;
    3、temp:建立臨時檔案的目錄,當iOS裝置重啟時,檔案會被自動清除。

  • 獲取沙盒的目錄

.h檔案
#import <Foundation/Foundation.h>

@interface YDWSandBoxPath : NSObject

// 獲取沙盒Document檔案目錄
+ (NSString *)getDocumentDirectory;

// 獲取沙河Library檔案目錄
+ (NSString *)getLibraryDirectory;

// 獲取沙盒Library/Caches檔案目錄
+ (NSString *)getCacheDirectory;

// 獲取沙盒Preference檔案目錄
+ (NSString *)getPreferencePanesDirectory;

//獲取沙盒tmp檔案目錄
+ (NSString *)getTmpDirectory; @end .m檔案 #import "YDWSandBoxPath.h" @implementation YDWSandBoxPath + (NSString *)getDocumentDirectory { return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getLibraryDirectory { return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES
) lastObject]; } + (NSString *)getCacheDirectory { return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getPreferencePanesDirectory { return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject]; } + (NSString *)getTmpDirectory { return NSTemporaryDirectory(); } @end
  • 清除快取:在開發的過程中,遇到有用的資料,會進行快取,當該資料不需要時,可以清除。在這裡整理了幾個方法,統計檔案的大小,清除指定檔案,清除指定目錄下的全部檔案等。
// 根據路徑返回目錄或檔案的大小
+ (double)sizeWithFilePath:(NSString *)path {
    // 獲取檔案的管理者
    NSFileManager *manager = [NSFileManager defaultManager];
    // 檢測路徑的合理性
    BOOL direct = NO;
    BOOL exits = [manager fileExistsAtPath:path isDirectory:&direct];
    if (!exits) {
        return 0;
    }
    if (direct) {
        NSArray *subPaths = [manager subpathsAtPath:path];
        int totalSize = 0;
        for (NSString *subPath in subPaths) {
            NSString *fullSubPath = [path stringByAppendingPathComponent:subPath];
            BOOL dir = NO;
            [manager fileExistsAtPath:path isDirectory:&dir];
            if (!dir) {
                NSDictionary *attrs = [manager attributesOfItemAtPath:fullSubPath error:nil];
                totalSize += [attrs[NSFileSize] integerValue];
            }
        }
        return totalSize/(1024*1024.0);
    } else {
        NSDictionary *attrs = [manager attributesOfItemAtPath:path error:nil];
        return [attrs[NSFileSize] intValue]/(1024*1024.0);
    }
}

// 得到指定目錄下的所有檔案
+ (NSArray *)getAllFileNames:(NSString *)dirPath {
    return [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:dirPath error:nil];
}

// 刪除指定目錄或檔案
+ (BOOL)clearCacheWithFilePath:(NSString *)path {
    return [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}

// 清空指定目錄下檔案
+ (BOOL)clearCacheFormDirectoryPath:(NSString *)dirPath {
    NSArray *fileArray = [YDWSandBoxPath getAllFileNames:dirPath];
    BOOL flag = NO;
    for (NSString *fileName in fileArray) {
        NSString *filePath = [dirPath stringByAppendingPathComponent:fileName];
        flag = [YDWSandBoxPath clearCacheWithFilePath:filePath];
        if (!flag) {
            break;
        }
    }
    return flag;
}

NSData

  • NSData儲存的是二進位制資料,遮蔽了資料之間的差異,文字、音訊、影象等資料都可用NSData來儲存;
  • NSData的用法:
    1、NSString與NSData互相轉換
    NSData –> NSString為:NSString *dataString = [[NSString alloc] initWithData:[NSData data] encoding:NSUTF8StringEncoding];

    NSString –> NSData為:NSData *stringData = [[NSString string] dataUsingEncoding:NSUTF8StringEncoding];

    將data型別的資料,轉成UTF8的資料:

+ (NSString*)dataToUTF8String:(NSData *)data {
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

將string轉換為指定編碼 :

+ (NSString *)changeDataToEncodinString:(NSData *)data encodin:(NSStringEncoding )encoding {
    return [[NSString alloc] initWithData:data encoding:encoding];
}

2、NSData 與 UIImage
NSDat –> UIImage為:UIImage *image = [UIImage imageWithData: imageData];
例如:

- (NSData *)changePictureToNSData {
    NSString *filePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"ceshi.png"]];
    NSData *imageData = [NSData dataWithContentsOfFile:filePath];
    return imageData;
}

Plist檔案 ##:

陣列、字典只能將BOOL、NSNumber、NSString、NSData、NSDate、NSArray、NSDictionary寫入屬性列表plist檔案.

  • String方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
    [[NSString string] writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
  • Array方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
    [[NSArray array] writeToFile:path atomically:YES];
  • Dictionary方式新增
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"xxx.plist"];
    [[NSDictionary dictionary] writeToFile:path atomically:YES];