2017-05-10 16 views
-1

最新のst_mtimeに基づいてディレクトリリストをソートしようとしていますが、構造体をソートする方法配列私は割り当てています。 ?どのように私は、最新の日付に応じて構造体を並べ替えることができます...ここに私の現在のアプローチがあります:statの呼び出しからctimeの戻り値を使用して構造体の配列をソートしようとしています

static int cmpstringp(const void *p1, const void *p2){ 

    return strcmp(* (char * const *) p1, * (char * const *) p2); 
} 


struct directoryStat dStat{ 
     char name[50]; 
     char time[50]; 

    }; 

    int main(){ 

     i = 0; 
     while ((ep = readdir(dp))){ 

      stat(ep->d_name, &fileStat); 
      strcpy(dStat[i].name, ep->d_name); 
      strcpy(dStat[i].time, ctime(&fileStat.st_mtime)); 
      i++; 

     } 
    } 

qsort(dStat, i, sizeof(char), cmpstringp); 
+1

2.6カーネルので、 'stat'両方'構造体TIMESPEC st_ctim提供します。 'ctime'の呼び出しは、あなたが望むものではないと思われる形式の文字列を返します。\ n" '(see:* man ctime *)\" "水曜日Jun 30 21:49:08 1993 \ n" –

+0

比較ルーチンは、サポートされている場合は、 'strptime'を使って時間文字列をバイナリ形式に変換し直すことができます。ただし、DSTの終わりにクロックが戻ってくる期間は、一部の時間文字列があいまいになります。 –

答えて

1

時間(または日時)をソートこのため、その文字列表現に基づいて - 値は、良いアイデアではないかもしれませんおそらく日付/時間値のローカライゼーションに依存する文字列表現に基づく(辞書順)順序は、時系列順に対応しないことがある(例えば、David C. Rankinのコメントを参照)。代わりに生のtime_t値を保存して比較したいと思います。

文字列値による並べ替えとtime_t値による並べ替えの両方を示す次のコードを参照してください。それが役に立てば幸い!結果の数値ソートに直接使用することができるいずれもの `と`の#defineファイルのst_ctime st_ctim.tv_sec`;

typedef struct directoryStat { 
    char name[50]; 
    char timeStr[50]; 
    time_t timeVal; 
}dStat; 


int cmpDStatTimeStr(const void *p1, const void *p2){ 

    return strcmp(((dStat*)p1)->timeStr, ((dStat*)p2)->timeStr); 
} 

int cmpDStatTimeVal(const void *p1, const void *p2){ 

    return ((dStat*)p1)->timeVal > ((dStat*)p2)->timeVal; 
} 

int main(){ 

    dStat stat[2] = { { "the former", "2017/5/2", 14500000 }, { "the latter","2017/5/12", 14500001 }}; 

    // sort based on string value (lexigraphical comparison): 
    qsort(stat, 2, sizeof(dStat), cmpDStatTimeStr); 

    // sort based on time value directly: 
    qsort(stat, 2, sizeof(dStat), cmpDStatTimeVal); 

    return 0; 
} 
+1

これは非常に役に立ちました。私は、それは文字列にtime_tの値を減らし、そのようにソートするばかげたアプローチかもしれないと思うが、両方の方法をデモしてくれてありがとう。 – James

関連する問題