天天看點

IOS學習筆記 - NSFileManager,沙盒路徑,NSString類路徑處理,NSCache,讀取檔案頭判斷圖檔類型

1,沙盒路徑的一些操作

IOS沙盒路徑:

iOS的沙盒機制,應用隻能通路自己應用目錄下的檔案。iOS不像android,沒有SD卡概念,不能直接通路圖像、視訊等内容。iOS應用産生的内容,如圖像、檔案、緩存内容等都必須存儲在自己的沙盒内。預設情況下,每個沙盒含有3個檔案夾:Documents, Library 和 tmp。Library包含Caches、Preferences目錄。

Documents:蘋果建議将程式建立産生的檔案以及應用浏覽産生的檔案資料儲存在該目錄下,iTunes備份和恢複的時候會包括此目錄

Library:存儲程式的預設設定或其它狀态資訊;

Library/Caches:存放緩存檔案,儲存應用的持久化資料,用于應用更新或者應用關閉後的資料儲存,不會被itunes同步,是以為了減少同步的時間,可以考慮将一些比較大的檔案而又不需要備份的檔案放到這個目錄下。

tmp:提供一個即時建立臨時檔案的地方,但不需要持久化。裝置重新開機時候資料将被清空。

擷取沙盒路徑的方法:

IOS學習筆記 - NSFileManager,沙盒路徑,NSString類路徑處理,NSCache,讀取檔案頭判斷圖檔類型
- (void)box
{
    
    //1,擷取沙盒路徑
    NSString *homePath = NSHomeDirectory();
    NSLog(@"homePath = %@", homePath);
    
    //2,擷取Documents路徑
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSArray *path1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pathDocument = [path1 objectAtIndex:0];
    NSLog(@"pathDocument = %@", pathDocument);
    
    //3,擷取Library路徑
    //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *pathLibrary = [path2 objectAtIndex:0];
    NSLog(@"pathLibrary = %@", pathLibrary);
    
    //4,擷取Cache路徑
    NSArray *path3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *pathCache = [path3 objectAtIndex:0];
    NSLog(@"pathCache = %@", pathCache);
    
    //5,擷取tmp路徑
    //[NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
    NSString *pathTmp = NSTemporaryDirectory();
    NSLog(@"pathTmp = %@", pathTmp);
    

}
           

2,NSFileManager的相關操作

- (void)testFileManager
{
    NSArray *path1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *pathDocument = [path1 objectAtIndex:0];
    
    //1,建立檔案夾(目錄)
    NSString *pathGroup = [pathDocument stringByAppendingPathComponent:@"pathGroup"];
    BOOL createFileGroup = [[NSFileManager defaultManager] createDirectoryAtPath:pathGroup withIntermediateDirectories:YES attributes:nil error:nil];
    if (createFileGroup) {
        NSLog(@"檔案夾建立成功");
    }else{
        NSLog(@"檔案夾建立失敗");
    }
    
    //2,建立檔案
    NSString *pathFile0 = [pathGroup stringByAppendingPathComponent:@"pathGroup.txt"];
    BOOL createFile = [[NSFileManager defaultManager] createFileAtPath:pathFile0 contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    if (createFile) {
        NSLog(@"建立檔案成功");
    }else{
        NSLog(@"建立檔案失敗");
    }
    
    //3,判斷一個檔案是否存在
    NSString *pathFile1 = [pathDocument stringByAppendingPathComponent:@"abc.txt"];
    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:pathFile0];
    if (isExist) {
        NSLog(@"pathFile1 Exist");
    }else{
        NSLog(@"pathFile1 Not Exist");
    }
    
    //4,讀取檔案内容
//    NSData *data = [fileManger contentsAtPath:myFilePath];//myFilePath是包含完整路徑的檔案名
//    NSData *data = [NSData dataWithContentsOfFile:pathFile0];
//    NSString *fileContents = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSString *fileContents = [NSString stringWithContentsOfFile:pathFile0 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"檔案讀取成功 %@", fileContents);
    
    //5,寫資料到檔案
    NSString *contents = [fileContents stringByAppendingString:@"\n sdf\n新添加的資料"];
    [contents writeToFile:pathFile0 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    /*- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
     或 NSData 的
     - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
     - (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr; */
    
    //6,讀取檔案屬性
    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:pathFile0 error:nil];
    NSArray *allKeys = [dict allKeys];
    for (id key in allKeys) {
        NSLog(@"key : %@", key);
        NSLog(@"value : %@ ", [dict objectForKey:key]);
    }
    
    //7,檔案重命名
    //一般都是通過移動一個檔案來給檔案重命名
//    [fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error];
    
    //8,删除檔案,
    BOOL deleteFile = [[NSFileManager defaultManager] removeItemAtPath:pathFile0 error:nil];//如果pathFile0是一個路徑,則會删除檔案夾下所有的内容
    if (deleteFile) {
        NSLog(@"删除檔案成功");
    }else{
        NSLog(@"删除檔案失敗");
    }
    NSLog(@"檔案是否存在 %@", [[NSFileManager defaultManager] fileExistsAtPath:pathFile0][email protected]"YES":@"NO");
    [[NSFileManager defaultManager] isExecutableFileAtPath:pathFile0];
    
    //9,擷取一個目錄下所有的檔案名
    //兩個方法傳回資料一樣,傳回指定目錄下所有的檔案夾和檔案的目錄
    NSArray *file = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath: NSHomeDirectory() error:nil];
    NSArray *files = [[NSFileManager defaultManager] subpathsAtPath: NSHomeDirectory() ];
    
    
    //10,比較檔案内容是否相同
    // - (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString *)path2;

    
    
    //11,下面這幾個方法,可以在操作檔案之前先判斷是否可以操作,比如是否可以讀取,可讀的時候再取讀取,為了避免不必要的錯誤
//    - (BOOL)fileExistsAtPath:(NSString *)path;
//    - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
//    - (BOOL)isReadableFileAtPath:(NSString *)path;
//    - (BOOL)isWritableFileAtPath:(NSString *)path;
//    - (BOOL)isExecutableFileAtPath:(NSString *)path;
//    - (BOOL)isDeletableFileAtPath:(NSString *)path;
    
    /*
     12,指派,移動,建立快捷方式,删除檔案
     //These methods replace their non-error returning counterparts below. See the NSFileManagerDelegate protocol below for methods that are dispatched to the NSFileManager instance's delegate.
    - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)linkItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
    - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);*/
}
           

3,NSString類路徑的處理方法

檔案路徑的處理
NSString *path = @"/Uesrs/apple/testfile.txt"

常用方法如下
//1 獲得組成此路徑的各個組成部分,結果:("/","User","apple","testfile.txt")
- (NSArray *)pathComponents;

//2 提取路徑的最後一個組成部分,結果:testfile.txt
- (NSString *)lastPathComponent;

//3 删除路徑的最後一個組成部分,結果:/Users/apple
- (NSString *)stringByDeletingLastPathCpmponent;

//4 将path添加到已有路徑的末尾,結果:/Users/apple/testfile.txt/app.txt
- (NSString *)stringByAppendingPathConmponent:(NSString *)str;

//5 去路徑最後部分的擴充名,結果:text
- (NSString *)pathExtension;

//6 删除路徑最後部分的擴充名,結果:/Users/apple/testfile
- (NSString *)stringByDeletingPathExtension;

//7 路徑最後部分追加擴充名,結果:/User/apple/testfile.txt.jpg
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
           

4,NSData常用操作

NSData是用來包裝資料的
NSData存儲的是二進制資料,屏蔽了資料之間的差異,文本、音頻、圖像等資料都可用NSData來存儲

NSData的用法
1.NSString與NSData互相轉換
<strong>NSData-> NSString  </strong>                                                                                   NSString *aString = [[NSString alloc] initWithData:adataencoding:NSUTF8StringEncoding];

<strong>NSString->NSData  </strong>                                                                                    NSString *aString = @"1234abcd";
NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding]; 

<strong>将data類型的資料,轉成UTF8的資料</strong>
+(NSString *)dataToUTF8String:(NSData *)data
{
NSString *buf = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [buf autorelease];
}

<strong>将string轉換為指定編碼</strong> 
+(NSString *)changeDataToEncodinString:(NSData *)data encodin:(NSStringEncoding )encodin{
    NSString *buf = [[[NSString alloc] initWithData:data encoding:encodin] autorelease];
    return buf;
}

2. NSData 與 UIImage
NSData->UIImage
UIImage *aimage = [UIImage imageWithData: imageData];
 
//例:從本地檔案沙盒中取圖檔并轉換為NSData
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *name = [NSString stringWithFormat:@"ceshi.png"];
NSString *finalPath = [path stringByAppendingPathComponent:name];
NSData *imageData = [NSData dataWithContentsOfFile: finalPath];
UIImage *aimage = [UIImage imageWithData: imageData];

3.NSData與NSArray  NSDictionary
+(NSString *)getLocalFilePath:(NSString *) fileName
{
return [NSString stringWithFormat:@"%@/%@%@", NSHomeDirectory(),@“Documents”,fileName];
}

包括将NSData寫進Documents目錄
從Documents目錄讀取資料
在進行網絡資料通信的時候,經常會遇到NSData類型的資料。在該資料是dictionary結構的情況下,系統沒有提供現成的轉換成NSDictionary的方法,為此可以通過Category對NSDictionary進行擴充,以支援從NSData到NSDictionary的轉換。聲明和實作如下:
 
+ (NSDictionary *)dictionaryWithContentsOfData:(NSData *)data {     
    CFPropertyListRef list = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)data, kCFPropertyListImmutable, NULL);
    if(list == nil) return nil; 
    if ([(id)list isKindOfClass:[NSDictionary class]]) { 
         return [(NSDictionary *)list autorelease]; 
        } 
    else { 
         CFRelease(list); 
         return nil; 
        } 
}
           

5,NSCache

NSCache 在系統記憶體很低時,會自動釋放一些對象

備注:這句話源自蘋果的官方文檔,不過在模拟器中模拟記憶體警告時,緩存不會做清理動作 為了確定接收到記憶體警告時能夠真正釋放記憶體,最好調用一下 removeAllObjects 方法

NSCache 是線程安全的,在多線程操作中,不需要對 Cache 加鎖

NSCache 的 Key 隻是做強引用,不需要實作 NSCopying 協定

<pre name="code" class="objc">@interface NSCache : NSObject {
@private
    id _delegate;
    void *_private[5];
    void *_reserved;
}

@property (copy) NSString *name;

@property (assign) id<NSCacheDelegate> delegate;

           
//1,向NSCache對象中添加和取出對象的方法和 字典的操作類似
- (id)objectForKey:(id)key;
- (void)setObject:(id)obj forKey:(id)key; // 0 cost
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
- (void)removeObjectForKey:(id)key;

- (void)removeAllObjects;
//2,總共的花費,就是總共要占用的資源,開發一般用不到
@property NSUInteger totalCostLimit;	// limits are imprecise/not strict
           
//3,對象中最多緩存的數量,超出數量的将被删除
@property NSUInteger countLimit;	// limits are imprecise/not strict/Default is 0, No limit
@property BOOL evictsObjectsWithDiscardedContent;

@end

@protocol NSCacheDelegate <NSObject>
@optional
           
//4,NSCache的代理方法,一般用于程式員調試,obj表示将要被删除的對象
           
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;
@end
           

6,讀檔案頭判斷檔案類型

mimeType 類型

http://www.w3school.com.cn/media/media_mimeref.asp

關于圖檔格式

// 圖檔的格式
PNG: 無損壓縮!壓縮比較低。 PNG圖檔一般會JPG大。
- GPU解壓縮的消耗非常小。解壓縮的速度比較快,比較清晰,蘋果推薦使用
JPG: 有損壓縮!壓縮比非常高!照相機使用。
- GPU解壓縮的消耗比較大
GIF: 可動畫的圖檔
BMP: (位圖),沒有任何壓縮。幾乎不用
           

幾種常見格式檔案的檔案頭内容

1.JPEG
- 檔案頭辨別 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 檔案辨別)
- 檔案結束辨別 (2 bytes): 0xff, 0xd9 (EOI)

2.TGA
- 未壓縮的前5位元組    00 00 02 00 00
- RLE壓縮的前5位元組   00 00 10 00 00

3.PNG
- 檔案頭辨別 (8 bytes)   89 50 4E 47 0D 0A 1A 0A

4.GIF
- 檔案頭辨別 (6 bytes)   47 49 46 38 39(37) 61
                        G  I  F  8  9 (7)  a

5.BMP
- 檔案頭辨別 (2 bytes)   42 4D
                        B  M

6.PCX
- 檔案頭辨別 (1 bytes)   0A

7.TIFF
- 檔案頭辨別 (2 bytes)   4D 4D 或 49 49

8.ICO
- 檔案頭辨別 (8 bytes)   00 00 01 00 01 00 20 20

9.CUR
- 檔案頭辨別 (8 bytes)   00 00 02 00 01 00 20 20

10.IFF
- 檔案頭辨別 (4 bytes)   46 4F 52 4D
                        F  O  R  M

11.ANI
- 檔案頭辨別 (4 bytes)   52 49 46 46
                        R  I  F  F
           

繼續閱讀