2015-01-02 3 views
0

안녕하세요 저는 'q'를 입력하지 않으면 폴더를 스캔하는 프로그램을 작성해야하며 새 파일이 발견되면 인쇄합니다. 난 이미 내 마지막 연습을 위해 이것을 썼는데 괜찮 았어 (단순히 폴더의 모든 파일을 스캔하고 인쇄하는 것)하지만이 문제를 어떻게 다룰 지 모릅니다.c 새 파일을 검색하는 폴더

DIR *dp; 
struct dirent *ep;  
dp = opendir (directory); 
if (dp != NULL) 
{ 
    while (ep = readdir (dp)) 
{ 
puts (ep->d_name); 
} 
(void) closedir (dp); 
} 
else 
perror ("Couldn't open the directory"); return 1; 

편집 :

pthread_mutex_t mojmuteks=PTHREAD_MUTEX_INITIALIZER; 

void *change(char *status) 
{ 
    int x=1; 
    while(x==1) 
    { 
     pthread_mutex_lock(&mojmuteks); 
     *status=getchar(); 
     pthread_mutex_unlock(&mojmuteks); 
    } 
} 


main(int argc, char *argv[]) 
{ 
DIR *dp; 
struct dirent *ep; 
struct stat file_stat; 
time_t last=0; 
char status='n'; 
pthread_t mojwatek; 

if (pthread_create(&mojwatek, NULL, change, &status)) 
{ 
    printf("błąd przy tworzeniu wątku."); 
    abort(); 
} 
pthread_mutex_lock(&mojmuteks); 
while(status!='q') 
{ 
    pthread_mutex_unlock(&mojmuteks); 
    dp = opendir (argv[1]); 
    last=file_stat.st_ctime; 
    if (dp != NULL) 
    { 
     while (ep = readdir (dp)) 
     { 
      stat(ep->d_name, &file_stat); 
      if(last>file_stat.st_ctime) 
      last=file_stat.st_ctime; 
     } 

    } 
    else 
    { 
     perror ("Couldn't open the directory"); 
     return 1; 
    } 
    (void) closedir (dp); 
    dp = opendir (argv[1]); 
    if (dp != NULL) 
     { 
     while (ep = readdir (dp)) 
     { 
       stat(ep->d_name, &file_stat); 
       if(last<file_stat.st_ctime) 
       puts (ep->d_name); 
     } 

     } 
     else 
     { 
     perror ("Couldn't open the directory"); 
     return 1; 
     } 
     closedir(dp); 
    pthread_mutex_lock(&mojmuteks); 
} 


return 0; 
} 

2 개 질문을했다 : 뮤텍스를 사용하여가, 각 경로 후 "메인"과정 "에서 응답을 기다리고 난 이미이 그래서

확인 변경 "을 실행하는 대신"q "를 입력하지 않으면 문제를 해결할 수 있습니까? 두 번째 질문 : st_ctime을 사용하여 어떤 파일이 더 오래된 지 확인하고 있지만 일부 파일에는이 변수에 항상 0 값이 있습니다. 왜 그리고 어떻게 수정해야합니까?

+0

을 사용해야합니다. 파일 이름을 인쇄하려면 사용자에게 확인 메시지를 보내야합니까 ??? –

+0

이 문제가 _ 이상합니다. 문제가 무엇인지 설명하지 못했습니까? – Matt

+0

아니요, 모든 확인이 필요하지 않습니다. 사용자가 Finnish 스캔을 원하면 'q'를 누를 수 있습니다. – MrKaszu

답변

0

마지막 스캔 시간을 기록하고 스캔 한 각 파일에 fstat 함수를 사용하면 stat 버퍼를 채우고 핸들을 전달한 파일에 대한 정보를 전달할 수 있습니다. 마지막으로 스캔 한 시간과 작성한 시간을 비교하면 here입니다. 생성 시간이 마지막 스캔의 시간보다 작 으면 파일 이름을 인쇄 할 수 있습니다.

statfstat이 아니며 파일 핸들이 없으면이 목적으로 만 파일을 열려고하지 마십시오.

0

일반적으로 파일 시스템의 변경 사항을 모니터링하려면 inotify (http://man7.org/linux/man-pages/man7/inotify.7.html)를 사용해야합니다. API는 약간 복잡하므로 사용자의 목적에 맞지 않을 것입니다.

디렉터리 검색 루틴은 하위 디렉터리로 내려 가지 않으며 다양한 링크, 파이프 등을 다루지 않습니다. 단순히 이름을 인쇄하는 것 이외의 다른 목적을 위해서는 ftw (http://man7.org/linux/man-pages/man3/nftw.3.html)