2012-05-04 2 views
8

나는 파일의 마지막 수정 시간을 얻는 데 필요한 C 프로그램을 만들고있다. 프로그램이 수행하는 기능은 디렉토리 내의 각 파일을 반복하는 함수이며 특정 파일이 발견되면 파일의 마지막 수정 시간을 확인하는 또 다른 함수를 호출합니다. 내가 ll 명령은 내가 mylog.txt.1mylog.txt.2는 4 일에 수정 된 및 mylog.txt.3는 3 일에 수정 된 것을 볼 수 있습니다 사용하여 리눅스에서 디렉토리를 나열 할 때 디렉토리 내에서리눅스에서 파일의 마지막 수정 시간 얻기

mylog.txt.1, mylog.txt.2mylog.txt.3 등이있다.

그러나 프로그램이 각 파일을 검사 할 때 항상 3rd 3rd를 반환합니다. 아래는 내가 사용하고있는 코드입니다.

void getFileCreationTime(char *filePath) 
{ 
    struct stat attrib; 
    stat(filePath, &attrib); 
    char date[10]; 
    strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime))); 
    printf("The file %s was last modified at %s\n", filePath, date); 
    date[0] = 0; 
} 

나는 st_ctime, 즉 st_mtimest_atime의 모든 다른 변화를 시도했지만 그들은 모두 반환 3 월.

도움을 주셔서 감사합니다.

+0

어쩌면 정리 첫째 : 버퍼가 긴 10 동안 왜 strftime''20의 크기를 통과? 왜'stat'의 반환 값을 확인하지 않겠습니까? 'stat'가 실패하면 쓰레기 값을 파싱합니다. – mvds

+0

@mvds 오모자입니다. – Boardy

+0

다른 파일 경로를 전달하고 있는지 확인하십시오. "마지막 변경 시간"을 찾고있는 경우 "attrib.st_ctime"은 "마지막 상태 변경 시간"을 제공합니다. " attrib.st_mtime " – ray

답변

9

시간대가 중요한 경우 중 하나입니다. st_mtimegmtime이 표시됩니다. 대신 localtime 즉 사용해야합니다.

strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime))); 

ls이 시간대 정보를 사용하여, 당신은 화면의 한 부분으로 gmtime를 사용하는 경우, 그것은 의도적으로 어떤 시간대 정보를 생략하기 때문이다.

+1

나는 여전히 더 많은 에러 검사를 당신의 함수에서 할 것을 권한다. – Petesh

3

상황이 해결합니다 :

  • , 즉 st_ctime을 적절한 필드를 사용합니다.
  • 결과를 사용하기 전에 stat()이 성공했는지 확인하십시오.
  • 잘못된 버퍼 크기 사용의 위험을 제거하려면 strftime(date, sizeof date, ...을 사용하십시오.

나는 처음에는 파일 시스템이 마지막으로 수정 한 시간을 추적하는 것을 지원하지 않는다고 생각했지만 다른 도구가이 파일을 표시한다고 말했기 때문에 어떤 이유로 든 코드가 손상되었다고 생각됩니다.

파일 이름이 전체 경로 이름이 아니어야합니다. 즉, 올바른 디렉토리 접두사가 포함되지 않았습니까?

9

이 나를 위해 잘 작동 :

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

void getFileCreationTime(char *path) { 
    struct stat attr; 
    stat(path, &attr); 
    printf("Last modified time: %s", ctime(&attr.st_mtime)); 
} 
관련 문제