« GALAXY Note docomo版SC-05D 純正フリップケースホワイト レビュー | トップページ | GALAXY Note 純正レザーポーチ ホワイトレビュー »

objectiv-cにて指定フォルダのファイル一覧をファイル作成日順にソートして取得するプログラム

ファイルの作成日順にファイルリストを取得したかったんだけどなかなかそれっぽいコードが見つからなかったので自分でメソッド作ってみましたー。

+ (NSArray*)getFileListWithDateSortAtPath:(NSString *)path
                                                 ascending:(BOOL)ascending
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *doc = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString *targetPath = [NSString stringWithFormat:@"%@/%@",doc,path];

    //ターゲットフォルダのファイル一覧を取得
    NSArray *array = [fileManager directoryContentsAtPath:targetPath];

    //ファイル一覧のファイル名を元にファイル作成日とファイル名を取得してnewArrayにNSDictionary形式で格納
    NSMutableArray *newArray = [[NSMutableArray alloc]init];

    for (int i = 0; i<[array count]; i++)
    {
        NSString *filePath      = [NSString stringWithFormat:@"%@/%@",targetPath,[array objectAtIndex:i]];
        NSDictionary *fileDict  = [fileManager fileAttributesAtPath:filePath traverseLink:NO];
        NSString *date          = [[fileDict objectForKey:NSFileCreationDate] description];
        NSDictionary *dict      = [[NSDictionary alloc]initWithObjectsAndKeys:[array objectAtIndex:i],@"name",
                                   date,@"date",nil];
        [newArray addObject:dict];
        [dict release];
    }

    //ファイル作成日を元に並び替え
    NSSortDescriptor *aSortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"date" ascending:ascending]autorelease];
    [newArray sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];

    //並び替えた後、ファイル名だけの配列を作成して返す
    NSMutableArray *sortedArray = [NSMutableArray array];

    for (int i = 0; i<[newArray count]; i++)
    {
        [sortedArray addObject:[[newArray objectAtIndex:i]objectForKey:@"name"]];
    }
    [newArray release];

    return sortedArray;
}

呼び出すときはこのように使って下さい。

NSArray *array = [self getFileListWithDateSortAtPath:@"" ascending:NO];

PathがDocuments直下の場合は@""それ以下のフォルダの場合はフォルダパスを指定。
ascendingは新しい順でソートしたい場合はNO 古い順の場合はYES
(追記)かみやんさんのご指摘で少し修正しました。

« GALAXY Note docomo版SC-05D 純正フリップケースホワイト レビュー | トップページ | GALAXY Note 純正レザーポーチ ホワイトレビュー »

iPhone/iPadアプリ開発」カテゴリの記事

コメント

詳しい解説ありがとうございます!
教えて頂いた解説を元にコードを書き直そうと思います〜。

ま、まだ使えているから直さなくてもよいけどfileAttributesAtPath:traverseLink:は、iOS2.0でdeprecatedですね。新しく作るなら attributesOfItemAtPath:error: を使いましょうとのことです。
(Class Referenceより)

descriptionは問題というのは、日本ではyyyy/MM/dd hh:mm:ss形式で帰ってくるかもしれないけど、言語設定を英語等に設定している人は、dd/MM/yyyy hh:mm:ss形式で帰ってきたりするので文字列でソートすると順序が変わります。
NSString* date = ~の行を
NSTimeInterval time = [[fileDict objectForKey:NSFileCreationDate] timeIntervalSince1970];
にするとNSTimeInterval型で取れます(NSTimeInterval型は実態はdouble型)。
double型は、NSDictionaryに直接入れることができないであろうから、NSNumberのインスタンスを
作ってそれにセットしてNSDirectoryに入れるのがよいかと。

あっ、本当ですね!言われて気づきました。ご指摘ありがとうございます
descriptionは問題があるのですね。NSStringからint型にする方法について調べてみようと思います。

ソースコードレビュー。
aSortDescriptor がメモリリークしてますよ~。init系は、autoreleaseを一緒の行につけた方が忘れにくいです。
あと、dateのdescriptionは言語設定によって表現が変わるのでできれば、数値としてソートした方が安全ですね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/137176/55017244

この記事へのトラックバック一覧です: objectiv-cにて指定フォルダのファイル一覧をファイル作成日順にソートして取得するプログラム:

« GALAXY Note docomo版SC-05D 純正フリップケースホワイト レビュー | トップページ | GALAXY Note 純正レザーポーチ ホワイトレビュー »

フォト

ブログ内カテゴリー

Amazon

気になる商品

  • 氷菓OVA11.5話
  • XBox360限定ホワイトカラー
  • 3DSLL充電台
  • TOX2
  • けいおん
  • ブレイブリーデフォルト
  • Mac book Pro Retina
  • Macbook Pro Retina
  • EP-804AWホワイト
  • New iPad 16GB ブラック
  • New iPad 32GB ブラック
  • New iPad 64GB ブラック
  • New iPad 16GB ホワイト
  • New iPad 32GB ホワイト
  • New iPad ホワイト64GB
  • 映画けいおん!
  • FE覚醒
  • アルティメットまどか
  • PS Vitaホワイト
  • DEAD OR ALIVE 5
  • 初音ミク -Project DIVA- f アクセサリーセット
  • すーぱーそに子 グラビアVer
  • マブラヴ オルタ イーニァ
  • 初音ミクProject Diva f
  • iOS5プログラミングブック
  • Gジェネオーバーワールド
  • 猫と椅子(アリスVer)
  • GALAXY Note純正フリップカバー
  • 3DSLLシルバー
  • 3DSLLレッド
  • 3DSLLホワイト
無料ブログはココログ

バナー

  • すーぱーそに子初主演ゲーム『ソニコミ』を応援しています