2013年1月21日月曜日

Objective-Cでファイルのタイムスタンプや属性を取得

どうも、俺@家です。
21日ですが、明けましておめでとうございます。
今年もよろしくお願いしマウス。チューチュー。

NSFileManagerでとあるディレクトリ以下にあるファイルを一覧で取得し、作成された日付順に並び替えたい場合。
// Cacheディレクトリ

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];


// ファイル一覧(サブディレクトリは除外)
NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];


// 属性情報を格納する配列
NSMutableArray *attributes = [NSMutableArray array];


// ファイル配列をループ
for (NSString *file in files) {

  // ファイル属性にファイルパスを追加するためにDictionaryを用意しておく
  NSMutableDictionary *tmpDictionary = [NSMutableDictionary dictionary];

  NSString *filepath = [path stringByAppendingPathComponent:file];
   // ファイル情報(属性)を取得
   // 取得できる情報については csoulsの日記 を参考に!
  NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:filepath error:nil];


  // tmp配列に属性を格納
  [tmpDictionary setDictionary:attr];

  // tmp配列にファイルパスを格納
  [tmpDictionary setObject:filepath forKey:@"FilePath"];

  [attributes addObject:tmpDictionary];
}


// ソートさせる
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:NSFileCreationDate ascending:NO];
NSArray *sortarray = [NSArray arrayWithObject:sortDescriptor];

// 並び替えられたファイル配列
NSArray *resultarray = [attributes sortedArrayUsingDescriptors:sortarray];

[sortDescriptor release];


なぜわざわざtmpDictionaryを用意するか?についてですが、
属性を取得する
  NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:filepath error:nil];
は、NSDictionaryなためファイルパスが追加できないためです。


以上でぇぇぇえぇす。