さぽろぐ

コンピューター・IT  |札幌市北区

ログインヘルプ


2012年05月09日

C言語 scandir() 日付でsort

scandir()でファイル作成順でリストするサンプル(自分メモ)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>

char gTgtDir[256];

int DotOmit(const struct dirent *pDe);
int TimeSort(const void *v1, const void *v2);

int main(int ac, char *av[])
{
    int             Cnt ;
    struct dirent   **pDe ;
    int             idx ;

    if (ac != 2) {
        fprintf(stderr, "Usage : %s TargetDir\n\n", av[0]);
        return  1 ;
    }
    strcpy(gTgtDir, av[1]);
    if (gTgtDir[strlen(gTgtDir)-1] != '/') {
        fprintf(stderr, "directoryの末尾に/を付けて下さい。\n\n");
        return  1 ;
    }

    Cnt = scandir(gTgtDir, &pDe, DotOmit, TimeSort);
    if (Cnt == -1) {
        perror("scandir ");
        return -1 ;
    }

    for (idx = 0 ; idx < Cnt ; idx++) {
        printf("No%4d : %s\n", idx+1, pDe[idx]->d_name);
        free(pDe[idx]);
    }

    free(pDe);
    return  0 ;
}

int DotOmit(const struct dirent *pDe)
{
    if (strcmp(pDe->d_name, "." ) &&    // "."でない
        strcmp(pDe->d_name, "..")) {    // かつ".."でもない
        return  1 ;
    }
    return  0 ;
}

int TimeSort(const void *v1, const void *v2)
{
    struct dirent   *d1, *d2 ;
    struct stat      s1,  s2 ;
    char            FNm[256];


    d1 = *(struct dirent **)v1 ;
    d2 = *(struct dirent **)v2 ;

    strcpy(FNm, gTgtDir);
    strcat(FNm, d1->d_name);
    stat  (FNm, &s1);

    strcpy(FNm, gTgtDir);
    strcat(FNm, d2->d_name);
    stat  (FNm, &s2);

//  return (int)(s1.st_mtime - s2.st_mtime) ;   // 古い順の場合
    return (int)(s2.st_mtime - s1.st_mtime) ;   // 新しい順の場合
}



簡単な動確しかしてないのでバグがあるかも。。。
後、ファイルが多いと遅い。


あなたにおススメの記事


同じカテゴリー(プログラミング)の記事
 Linux プログラムからtabを除く (2011-07-19 19:34)
 Linux プログラムで端末の幅・高さを取得する。 (2010-04-23 10:59)
 gccで 「リンクが完了しなかったの~」とエラーになったら。 (2009-12-01 17:41)

Posted by あるちゅう at 20:32│Comments(0)プログラミング
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
C言語 scandir() 日付でsort
    コメント(0)