2014年3月16日 星期日

Objective-C import & fileManager

今天上班好死不死被我遇到物件互相參照的問題,也就是傳說中的A.h file中include B.h,同時B.h又includeA.h的問題,這實在是個經典不能再經典問題,剛好利用這個機會來搞清楚

1. 首先在互相include的問題中需要有個概念,就是其中一個物件是"擁有者",另外一個物件是"知道者",什麼意思?舉個粒子,假設有天養了一隻狗狗,那我就是狗狗的擁有者,而狗狗知道我。這就是互相include,好啦!C的解法可以參考intel開發人員專區,這裡要講的是Objective c的解法,其實概念很像,要先讓知道者知道擁有者的存在即可, 所以我們在知道者的.h file中使用

@class

這個關鍵字,@class能告訴知道者有這個class存在,也就是擁有者的存在,然後再到.m檔中include擁有者,就可以對擁有者進行存取的動作,再Objective c中可能會遇到需要知道AppDelegate的存在,在Objective c中我們可以使用

[NSApplication sharedApplication] // osx
[UIApplication sharedApplication] // ios

來得到Application這個singleton,然後藉由

[NSApplication sharedApplication].delegate // osx
[UIApplication sharedApplication].delegate // ios

來得到AppDelegate這個物件,所以在某物件中的.h就會使用@class關鍵字
*.h file

@class AppDelegate;

@interface myObject : NSObject{
    ...
}

然後再去.m中import即可
*.m file

#import "AppDelegate.h"

@implementation myObject

    ...

@end

擁有者的部分就簡單喏!只要像平常一樣import即可XD


2. 最近的project需要檢查某資料夾大小有沒有過某個size,如果超過就要刪掉,保持在某個threshold之下,下面是一些上網找到好用的一些template

a. 檢查"資料夾"的大小(回傳byte):

- (unsigned long long int)folderSize:(NSString *)folderPath {
    NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil];
    __block unsigned long long int folderSize = 0;
    
    [folderContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:obj] error:nil];
        folderSize += [[fileAttributes objectForKey:NSFileSize] intValue];
    }];
    NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:folderSize countStyle:NSByteCountFormatterCountStyleFile];
    
    
    NSLog(@"folder size = %@, number = %llu",folderSizeStr,folderSize);
    return folderSize;
}

b. 檢查路徑下的資料夾是否存在,如果沒有存在就建立一個:

- (void)DirectoryExist{
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSString *dirPath = [NSString stringWithFormat:@"%@/Desktop/dir",NSHomeDirectory()];
    
    if(![fileManager fileExistsAtPath:dirPath]){
        
        [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
        NSLog(@"create file success");
    }
    
}

c. 檢查某資料夾下特定"副檔名"的所有file:

NSMutableString *dirPath = [NSMutableString stringWithFormat:@"%@/Desktop/MySNG/video",NSHomeDirectory()];
NSLog(@"folder size = %lld",[self folderSize:dirPath]);
            
NSArray* dirs = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil];
NSMutableArray *mp4Files = [[NSMutableArray alloc] init];
[dirs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
      NSString *filename = (NSString *)obj;
      NSString *extension = [[filename pathExtension] lowercaseString];
      if ([extension isEqualToString:@"mp4"]) {
            [mp4Files addObject:[dirPath stringByAppendingPathComponent:filename]];
      }
}];

d. 刪除檔案:


[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];

沒有留言:

張貼留言