utime 은 파일의 Access time 및 Modification time 을 변경할 때 사용하는 함수이다.
특정 파일 정렬을 할 때, 파일의 이름을 파싱해서 정렬을 하는 것이 아닌, 파일의 Modification time 을 기준으로 정렬을 해야하는 경우가 있다.
이런 경우, 파일 작업 이후에도 이전의 Modification time 을 유지해야 하는 경우가 있는데,
이런 경우, utime 을 사용하면 편리하다.
utime 은 input 인자로 utimebuf 라는 구조체를 사용한다. utime 을 이용하면 access time 과 modification time 을 수정할 수 있다.
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
SYNOPSIS
#include <sys/types.h>
#include <utime.h>int utime(const char *filename, const struct utimbuf *times);
#include <sys/time.h>
int utimes(const char *filename, const struct timeval times[2])
샘플 코드
/*
* main.c
*
* Copyright 2014 Sungtae Kim <pchero21@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <utime.h>
#include <stdlib.h>
#include <time.h>
void file_stat(struct stat sb);
int main(int argc, char **argv)
{
struct stat sb[2];
int i;
if (argc != 3) {
fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
exit(EXIT_FAILURE);
}
printf("Before utime-----------------------------------\n");
for(i = 0; i < 2; i++)
{
if (stat(argv[i + 1], &sb[i]) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
file_stat(sb[i]);
printf("--------\n");
}
struct utimbuf ubuf;
ubuf.actime = sb[0].st_atime;
ubuf.modtime = sb[0].st_mtime;
// Let's use utime!
utime(argv[2], &ubuf);
printf("\n\nAfter utime-----------------------------------\n");
for(i = 0; i < 2; i++)
{
if (stat(argv[i + 1], &sb[i]) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
file_stat(sb[i]);
printf("--------\n");
}
return 0;
}
void file_stat(struct stat sb)
{
switch (sb.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break;
}
printf("I-node number: %ld\n", (long) sb.st_ino);
printf("Mode: %lo (octal)\n",
(unsigned long) sb.st_mode);
printf("Link count: %ld\n", (long) sb.st_nlink);
printf("Ownership: UID=%ld GID=%ld\n",
(long) sb.st_uid, (long) sb.st_gid);
printf("Preferred I/O block size: %ld bytes\n",
(long) sb.st_blksize);
printf("File size: %lld bytes\n",
(long long) sb.st_size);
printf("Blocks allocated: %lld\n",
(long long) sb.st_blocks);
printf("Last status change: %s", ctime(&sb.st_ctime));
printf("Last file access: %s", ctime(&sb.st_atime));
printf("Last file modification: %s", ctime(&sb.st_mtime));
}
결과
pchero@MyGalaxy:~/workspace/Study/Program/file/stat_example$ ./main ./test.txt test2.txt Before utime----------------------------------- regular file I-node number: 12976592 Mode: 100664 (octal) Link count: 1 Ownership: UID=1000 GID=1000 Preferred I/O block size: 4096 bytes File size: 0 bytes Blocks allocated: 0 Last status change: Thu Aug 7 11:08:25 2014 Last file access: Thu Aug 7 10:56:34 2014 Last file modification: Thu Aug 7 10:56:34 2014 -------- regular file I-node number: 12976593 Mode: 100664 (octal) Link count: 1 Ownership: UID=1000 GID=1000 Preferred I/O block size: 4096 bytes File size: 0 bytes Blocks allocated: 0 Last status change: Thu Aug 7 11:11:53 2014 Last file access: Thu Aug 7 11:11:53 2014 Last file modification: Thu Aug 7 11:11:53 2014 -------- After utime----------------------------------- regular file I-node number: 12976592 Mode: 100664 (octal) Link count: 1 Ownership: UID=1000 GID=1000 Preferred I/O block size: 4096 bytes File size: 0 bytes Blocks allocated: 0 Last status change: Thu Aug 7 11:08:25 2014 Last file access: Thu Aug 7 10:56:34 2014 Last file modification: Thu Aug 7 10:56:34 2014 -------- regular file I-node number: 12976593 Mode: 100664 (octal) Link count: 1 Ownership: UID=1000 GID=1000 Preferred I/O block size: 4096 bytes File size: 0 bytes Blocks allocated: 0 Last status change: Thu Aug 7 11:12:01 2014 Last file access: Thu Aug 7 10:56:34 2014 Last file modification: Thu Aug 7 10:56:34 2014 --------