scandir 후 library 함수를 이용한 qsort

wputer의 이미지

#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

제가 뭐 놓친것 없나 검토 부탁드립니다

grassman의 이미지

printf("%s %s\n", ctime(..), ctime(..)); 대신

printf("%s ", ctime(..));
printf("%s\n", ctime(..));
으로 해 주면 정상적으로 출력될 겁니다.

>> 그리고... st_mtime은 구조체이므로 %d로 출력할 수 없습니다.
>> 이후 값은 모두 쓰레기값이 되므로 출력을 하려면 difftime의 결과값만 double 값으로 출력하시기 바랍니다.

------ 오류 수정합니다.

POSIX에서 st_mtime (time_t)는 부호있는 정수형이므로 %d로 출력할 수 있습니다.
자세히 찾아보지 않아서 잘못된 정보를 올렸군요.

wputer의 이미지

그라스맨님 감사합니다

저건 하도 안되서 답답해서 찍어넣은거였구요 ^_^;;

딱히 시간 차를 계산할 필요가 없는데 difftime() 함수때문에 막혔었군요
아래와 같이 수정하여 완료하였습니다

#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
 
 
 
 
 
 
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);
 
	if(stat(a->d_name, &st1) <0)
		fprintf(stderr, " fn_qsort_direncmp stat error : st1\n");
	if(stat(b->d_name, &st2) <0)
		fprintf(stderr, " fn_qsort_direncmp stat error : st2\n");
 
 
 
	if(st1.st_mtime > st2.st_mtime)
		return 1;
	else if(st1.st_mtime == st2.st_mtime) 
		return 0;
	else
		return -1;
 
}
 
 
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]);
 
 
	qsort( fileList, maxfiles, sizeof(fileList[0]), fn_qsort_direncmp ); 
 
	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);
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.