ファイルのタイムスタンプの変更

指定したファイルのタイムスタンプを変更する方法について説明します.
 
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

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)