scandir 후 library 함수를 이용한 qsort
글쓴이: wputer / 작성시간: 수, 2008/07/30 - 5:21오후
#include <arpa/inet.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <stdio.h> // qsort( a, MAX, sizeof(int), fn_qsort_intcmp ); int fn_qsort_direncmp( const void *va, const void *vb ) { struct dirent *a, *b; struct stat st1, st2; a = *(struct dirent **)(va); b = *(struct dirent **)(vb); printf("cmp (%s -> %s)\n", a->d_name, b->d_name); printf("%d ", stat(a->d_name, &st1)); printf("%d\n", stat(b->d_name, &st2)); printf("%s %s\n", ctime(&st1.st_mtime), ctime(&st2.st_mtime)); difftime(st1.st_mtime, st2.st_mtime)? '>' : '<', st2.st_mtime); printf("cmp (%d %d = %d)\n", st1.st_mtime, st2.st_mtime, difftime(st1.st_mtime, st2.st_mtime)); ctime(&st2.st_mtime)); return (difftime(st1.st_mtime, st2.st_mtime)); } int main(int argc, char *argv[]) { struct dirent **fileList; struct stat st; int maxfiles=0; char fileTemp[50]=""; chdir(argv[1]); maxfiles = scandir(".", &fileList, 0, 0); //이름순 정렬 if(maxfiles<3) { printf("theres no files in %s %d\n", argv[1], maxfiles); return -1; } printf("theres %d files in %s\n", maxfiles, argv[1]); while(maxfiles--) { sprintf(fileTemp, "./%s", fileList[maxfiles]->d_name); printf("%-3d ", stat(fileTemp, &st)); printf("%-20s \t\t %d %s", fileList[maxfiles]->d_name, st.st_mtime, ctime(&st.st_mtime)); } free(fileList); }
자꾸 fn_qsort_direncmp() 내부에서
검사하는
printf("cmp (%s -> %s)\n", a->d_name, b->d_name); printf("%d ", stat(a->d_name, &st1)); printf("%d\n", stat(b->d_name, &st2)); printf("%s %s\n", ctime(&st1.st_mtime), ctime(&st2.st_mtime));
의 출력 값들이 아래와 같이 파일명은 정상적으로 찍히는데
얻어오는 날짜들이 이상하게 나옵니다
cmp (1216773342 1200896564 = 1200896564) cmp (iter.cpp -> mnt2.c) 0 0 Wed Jul 23 09:35:42 2008 Wed Jul 23 09:35:42 2008 cmp (1216773342 1216777844 = 1216777844) cmp (iter.cpp -> b.txt) 0 0 Wed Jul 23 09:35:42 2008 Wed Jul 23 09:35:42 2008 cmp (1216773342 1179144638 = 1179144638) cmp (a.c -> b.txt~) 0 0 Thu Dec 13 17:18:12 2007 Thu Dec 13 17:18:12 2007
제가 뭐 놓친것 없나 검토 부탁드립니다
Forums:
ctime() 함수가 리턴하는 버퍼의 주소는 동일할 겁니다.
printf("%s %s\n", ctime(..), ctime(..)); 대신
printf("%s ", ctime(..));
printf("%s\n", ctime(..));
으로 해 주면 정상적으로 출력될 겁니다.
>> 그리고... st_mtime은 구조체이므로 %d로 출력할 수 없습니다.
>> 이후 값은 모두 쓰레기값이 되므로 출력을 하려면 difftime의 결과값만 double 값으로 출력하시기 바랍니다.
------ 오류 수정합니다.
POSIX에서 st_mtime (time_t)는 부호있는 정수형이므로 %d로 출력할 수 있습니다.
자세히 찾아보지 않아서 잘못된 정보를 올렸군요.
수정 후 완료
그라스맨님 감사합니다
저건 하도 안되서 답답해서 찍어넣은거였구요 ^_^;;
딱히 시간 차를 계산할 필요가 없는데 difftime() 함수때문에 막혔었군요
아래와 같이 수정하여 완료하였습니다
댓글 달기