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
--------

 

 

Tags: ,

Leave a Reply