指定したファイルのタイムスタンプを変更する方法について説明します.
UNIX ではファイルの時間に関する情報には次の3つのものがあります.
1) 最終アクセス時刻: atime
2) 最終更新時刻 : mtime
3) 最終属性変更時刻: ctime
この内 atime と mtime を,関数 utime を使って変更することができます.
utime を実行するに先立って,atime, mtime の値を utimbuf 構造体に格納しておく必要があります.
この構造体の内容に従って,指定したファイルのタイムスタンプを変更します.
utimbuf 構造体の定義
struct utimbuf { time_t actime; /* atime : access time */ time_t modtime; /* mtime : modification time */ }; |
例 char *fname で示されるパスのファイルのタイムスタンプを struct utimbuf utb の内容にする
utime(fname,&utb) |
処理が正常に終了すると戻り値は0となる.
サンプルプログラム s_utime.c:ファイル s_utime.out のタイムスタンプを1年後に設定する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <stdio.h> #include <time.h> #include <sys/types.h> #include <utime.h> int main() { FILE *f; time_t t; char ftime[128], fname[128];; struct tm *tstamp; struct utimbuf utb; /* file generation */ sprintf(fname,"s_utime.out"); f = fopen(fname,"w"); fclose(f); /* setting 1 year later */ t = time(NULL) + 86400 * 365; tstamp = gmtime(&t); strftime(ftime,sizeof(ftime),"%Y/%m/%d(%a) %H:%M:%S",tstamp); printf("%s\n",ftime); utb.actime = t; utb.modtime = t; /* changing time stamp */ if ( utime(fname,&utb) != 0 ) { fprintf(stderr,"utime failure!\n"); } } |
実行例
$ date ← 現在の日付を調べる 2015年 3月28日 土曜日 18時11分16秒 JST $ s_utime ← 1年後の日付にする 2016/03/27(Sun) 09:11:24 |
この後 “ls -la” コマンドで s_utime.out のタイムスタンプを調べる
-rwxr-xr-x 1 user1 staff 9056 3 28 17:57 s_utime -rw-r--r-- 1 user1 staff 585 3 28 17:57 s_utime.c -rw-r--r-- 1 user1 staff 0 3 27 2016 s_utime.out |