Easy ways

[C 언어] 디렉토리에서 가장 최근에/오래전에 수정된 파일 찾기. 본문

프로그래밍 언어/C언어

[C 언어] 디렉토리에서 가장 최근에/오래전에 수정된 파일 찾기.

softColors 2021. 1. 14. 16:49
반응형

디렉토리에서 가장 오래전에 수정된 파일을 제거하려고 코드를 보던중

스택 오버플로에서 아주 간단해보이는 방식을 찾아서 공유해드리려고 합니다.

 

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <ftw.h>

char filename[PATH_MAX];
time_t mtime = 0;

int check_if_newer(const char *path, const struct stat *sb, int typeflag)
{
    if (typeflag == FTW_F && sb->st_mtime > mtime) 
    {
        mtime = sb->st_mtime;
        strncpy(filename, path, PATH_MAX);
    }
    return 0;
}

int check_if_older(const char *path, const struct stat *sb, int typeflag) 
{
    if (typeflag == FTW_F && (mtime == 0 || sb->st_mtime < mtime)) 
    {
        mtime = sb->st_mtime;
        strncpy(filename, path, PATH_MAX+1);
    }
    return 0;

}


int main(void)
{
    char *directory = "./log"; 
    
    // The most recently modified file.
    ftw(directory, check_if_newer, FTW_F); 
    printf("last modified file   : %s\n", filename);

    // oldest modified file name
    ftw(directory, check_if_older, FTW_F); 
    printf("oldest modified file : %s\n", filename);

    return 0;
}

실행 결과 

 

 

이 코드에서 가장 중요한 함수는 ftw() 함수입니다.

ftw는 디렉토리에서 파일을 한번씩 살펴보고 처리하는 함수로,

매개변수 구조는 다음과 같습니다.

 

       #include <ftw.h>

       int ftw(const char *dirpath,
               int (*fn) (const char *fpath, const struct stat *sb,
                          int typeflag),
               int nopenfd);

 

보시면 ftw(파일경로, 수행할 함수, 파일 종류)로 구성되어있습니다.

첫번째 매개변수인 경로로 가서

두번째 매개변수인 함수를 수행하는 것입니다.

세번째 매개변수는 파일 종류로 간단하게 살펴보면 아래와 같습니다.

  • FTW_F fpath is a regular file.
  • FTW_D fpath is a directory.
  • FTW_DNR fpath is a directory which can't be read.

해당 경로에 있는 파일을 한번씩 보면서 함수를 수행하는 것입니다.

 

check_if_older 함수는 가장 오래된 파일을 찾아주는 것이고,

check_if_newer 함수는 수정된지 가장 최근 파일을 찾아 주는 함수입니다.

 

트리만드는 것 보다 좀 느릴 수 있지만 간편하네요!

한정된 로그를 관리할 때 좋을 것같습니다.

 

참조 :

stackoverflow.com/questions/25382163/getting-the-oldest-file-in-a-directory-c

man7.org/linux/man-pages/man3/ftw.3.html

반응형
Comments