2011-05-06 5 views
2

나는 주어진 시간의 하루 안에 액세스, 수정 또는 변경된 디렉토리의 모든 파일을 찾기 위해 사용자가 제공하는 디렉토리를 검색해야하는 프로그램을 작성 중입니다. 나는 두 가지 확실한 문제와 아마도 또 다른 문제를 안고 있습니다.사용자가 제공 한 디렉토리가있는 Glob?

첫 번째 문제는 얕은 검색을 수행하는 프로그램 만 가져올 수 있으며 하위 디렉토리를 조사하지 않는다는 것입니다. 디렉터리 버퍼에 연결 한 것과 관련이 있다고 확신합니다 (지금은 입니다.). 두 번째 문제는 대부분의 파일을 살펴 봤지만 모든 파일을 검색하지 않는다는 것입니다. 문제는이 파일로 돌아갑니다. 세 번째 "문제"는 각 파일의 액세스 시간을 확인할 때 모든 파일이 동일한 것처럼 보입니다 (변경되었거나 수정 된 시간에이 문제가 없음에도 불구하고). 액세스 시간에 영향을 줄 수 있다면 VM을 통해 우분투에서 실행 중입니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <glob.h> 

/* Function that checks if specified file was accessed, modified, or 
changed within a day of the specified time.     */ 
void checkFile(long long time, char * fileName) { 
struct stat *s; 
time_t accessTime; 
time_t modTime; 
time_t changeTime; 
s = malloc(sizeof(struct stat)); 
if(stat(fileName,s) == 0) { 
    accessTime = s->st_atime; 
    modTime = s->st_mtime;  
    changeTime = s->st_ctime; 
    if((time - accessTime) <= 86400 && (time - accessTime) >= -86400) 
     printf("%s\n",fileName); 
    else if((time - modTime) <= 86400 && (time - modTime) >= -86400) 
     printf("%s\n",fileName); 
    else if((time - changeTime) <= 86400 && (time - changeTime) >= -86400) 
     printf("%s\n",fileName); 
} 
free(s); 
} 

void searchDirectory(long long time, glob_t globbuf) { 
if(globbuf.gl_pathc == 0) 
    printf("there were no matching files"); 
else { 
    int i; 
    for(i = 0; i < globbuf.gl_pathc; i++) 
     checkFile(time,globbuf.gl_pathv[i]); 
} 
} 

int main(int argc, char** argv) { 
    long long time = atol(argv[1]); 
    char * buf = argv[2]; 
    strcat(buf,"*.*"); 
    glob_t globbuf; 
    glob(buf, 0, NULL, &globbuf); 
    searchDirectory(time,globbuf); 
    globfree(&globbuf); 
    return 0; 
} 

감사합니다.

답변

1

당신이해야하지

cat(buf, "*.*"); 

... '버피'는 운영 체제에서 제공하는 문자열에 대한 포인터이기 때문에 - 그 버퍼가 당신이 여분의 텍스트를 저장하기에 충분히 큰 경우 당신이 모르는 첨가. 큰 버퍼를 할당하고 argv[2]의 내용을 복사 한 다음 "*.*"을 추가 할 수 있습니다. 그러나 실제로는 argv[2 길이를 결정하고 버퍼가 충분히 큰지 확인해야합니다.

struct stat 구조의 st_mode 구성원을 사용하여 파일이 디렉터리인지 확인할 수 있습니다 (파일이 S_IFDIR인지 확인). 그렇다면 현재 디렉터리로 만들 수 있고 jonsca가 제안한대로 searchDirectory 함수를 다시 호출하십시오. 그러나 재귀를 사용할 때 재귀 깊이에 제한을 두거나 스택을 오버플로 할 수 있습니다. 이것은 '깊이 우선 검색'의 일종입니다. 내가 선호하는 해결책은 대기열을 사용하여 '폭 넓은 첫 번째 검색'을 수행하는 것입니다. 기본적으로 첫 번째 glob을 목록의 시작으로 밀어 넣은 다음 반복적으로 첫 번째 항목을 목록에서 제거하고 검색하여 새 디렉토리를 끝에 추가합니다. 목록이 비어있을 때까지 이동하십시오. 이 같은 프로그램을 평가할 때

, 교사가 너무 쉽게 자신의 스택을 날려하지 않는 :

P.S.을 사람들에게 상을 추가 포인트에 사랑 나는 접근 시간 문제가 VM/파일 시스템/etc 비 호환성이고 당신의 잘못이 아니라고 추측하고있다.

+0

유익한 답변을 보내 주셔서 감사합니다. –

관련 문제