トップC-Tips > ファイル、フォルダのタイプスタンプを得る

ファイル、フォルダのタイプスタンプを得る
エクスプローラでは、ファイルについては作成時間、アクセス時間、更新時間が得られ、 フォルダについては作成時間と更新時間が確認できる。 これらのタイムスタンプをプログラムで得る方法を示す。

1.stat関数を使う

まず、stat関数で得られる値を確認した。 st_ctime の c は create(作成)を意味するのではなく、状態変更、即ち change の c を表す。

しかし、次のプログラムとその実行結果を見ると、 st_ctimeはフォルダ、ファイルとも作成時間となっている。 st_mtimeはフォルダ、ファイルとも更新時間となっている。 st_atimeはフォルダでは更新時間、ファイルでは作成時間に一致している。

この情報は UNIX(LINUX)とWindowsでは異なるかも知れない。 また、Windowsでは OS によって異なるかもしれないので、 実際のシステムで確認する必要がある。

今回はアップロードプログラムを作成するために、これを調べた。 必要なのは、ファイルについては更新時間、フォルダについては作成時間である。 現在のパソコン環境では、 それぞれ st_mtime, st_ctime で得られることが分かった。

c:\mh\mcc>foldertime1
st_atime: Thu Mar 07 23:03:28 2013
st_mtime: Thu Mar 07 23:03:28 2013
st_ctime: Mon Aug 29 21:28:17 2011

st_atime: Wed Sep 07 23:05:44 2011
st_mtime: Wed Mar 06 23:12:31 2013
st_ctime: Wed Sep 07 23:05:44 2011

2._findfirst関数を使う

_findfirst関数では、ファイル情報が _finddata_t構造体で返される。 この構造体の定義を下に示す。 この場合には、作成時間、アクセス時間、更新時間が得られる。

struct _finddata_t {
    unsigned  attrib;        /* ファイル属性 */
    time_t    time_create;   /* -1 for FAT file systems */
    time_t    time_access;   /* -1 for FAT file systems */
    time_t    time_write;    /* 最終書き込み時刻 */
    _fsize_t  size;          /* ファイルサイズ   */
    char      name[260];     /* ファイル名       */
};

次のプログラムで確認した。

#include 
#include 

int main() {
    struct _finddata_t fdata;

    int fh = _findfirst("c:/mh/www", &fdata);
    _findclose(fh);
    printf("作成    : %s", asctime(localtime(&fdata.time_create))); 
    printf("アクセス: %s", asctime(localtime(&fdata.time_access)));
    printf("更新    : %s\n", asctime(localtime(&fdata.time_write)));

    fh = _findfirst("c:/mh/www/main.html", &fdata);
    _findclose(fh);
    printf("作成    : %s", asctime(localtime(&fdata.time_create))); 
    printf("アクセス: %s", asctime(localtime(&fdata.time_access)));
    printf("更新    : %s", asctime(localtime(&fdata.time_write)));
}

実行結果を下に示す。 作成時間、更新時間が正しく得られている。 アクセス時間は stat関数の場合と同じく、 フォルダでは更新時間、ファイルでは作成時間に一致している。

c:\mh\mcc>foldertime3
作成    : Mon Aug 29 21:28:17 2011
アクセス: Thu Mar 07 23:03:28 2013
更新    : Thu Mar 07 23:03:28 2013

作成    : Wed Sep 07 23:05:44 2011
アクセス: Wed Sep 07 23:05:44 2011
更新    : Wed Mar 06 23:12:31 2013

結局、stat関数でも、_findfirst関数でも同じ情報が得られることが分かった。 アップロードプログラムでは、全ファイルをスキャンするために _findfirst関数を使用するので、 タイムスタンプ情報もこの関数で得るのがプログラム全体としては、シンプルとなる。

3.Win32 APIのGetFileTime関数を使う

Win32 API関数を使えば、フォルダについて、エクスプローラと同様に、作成時間と更新時間が得られる。 この場合、アクセス時間は更新時間と同じとなった。