파일에 중복 여부를 확인하는 함수를 작성했습니다. 이 함수 서명은 다음과 같습니다C (Linux)에서 디렉토리를 통해 파일을 반복하고 "저장"하는 가장 좋은 방법은 무엇입니까?
int check_dup_memmap(char *f1_name, char *f2_name)
이 반환
- (-1) - 뭔가 잘못된 경우;
- (0) - 두 파일이 비슷한 경우;
- (+1) - 두 파일이 다른 경우.
다음 단계는 특정 디렉토리의 모든 파일을 반복하고 이전 기능을 적용하고 기존의 모든 중복에 대한 보고서를 제공하는 기능을 작성하는 것입니다.
처음에는 특정 디렉토리의 모든 파일 이름을 가진 파일을 생성 한 다음 해당 파일을 다시 읽고 두 파일을 모두 비교하여 비교하는 함수를 작성하려고 생각했습니다. 다음은 특정 디렉토리의 모든 파일 이름을 가져 오는 함수 버전입니다. 내가 다시하고 다시 파일을 구문 분석 할 필요로
void *build_dir_tree(char *dirname, FILE *f)
{
DIR *cdir = NULL;
struct dirent *ent = NULL;
struct stat buf;
if(f == NULL){
fprintf(stderr, "NULL file submitted. [build_dir_tree].\n");
exit(-1);
}
if(dirname == NULL){
fprintf(stderr, "NULL dirname submitted. [build_dir_tree].\n");
exit(-1);
}
if((cdir = opendir(dirname)) == NULL){
char emsg[MFILE_LEN];
sprintf(emsg, "Cannot open dir: %s [build_dir_tree]\t",dirname);
perror(emsg);
}
chdir(dirname);
while ((ent = readdir(cdir)) != NULL) {
lstat(ent->d_name, &buf);
if (S_ISDIR(buf.st_mode)) {
if (strcmp(".", ent->d_name) == 0 ||
strcmp("..", ent->d_name) == 0) {
continue;
}
build_dir_tree(ent->d_name, f);
}
else{
fprintf(f, "/%s/%s\n",util_get_cwd(),ent->d_name);
}
}
chdir("..");
closedir(cdir);
}
아직도 나는이 방법이 조금 비효율적 고려한다. 당신의 의견에
다른 방법은 내가 무엇을 따라야됩니다
- 이 자료 구조를 작성하고 파일을 작성하는 파일을 대신 잡아? 나는 파일이 많은 디렉토리에 대해 메모리가 매우 단편화 될 것이라고 생각한다.
- 자동 확장 배열에서 모든 파일 이름을 유지하면 인접한 메모리 위치에 있기 때문에 인덱스별로 모든 파일에 쉽게 액세스 할 수 있습니다.
- mmap()을 사용하여 메모리에서이 파일을 매핑 하시겠습니까? 그러나 mmap은 파일이 커질수록 실패 할 수 있습니다.
이에 대한 의견. 가장 효율적인 경로를 선택하고 최대한 적은 리소스로 액세스하려고합니다. 이것은 프로그램의 요구 사항입니다 ...
EDIT : 특정 디렉토리의 파일 수를 반복하지 않고도 얻을 수있는 방법이 있습니까?
왜 모든 항목을 조작하기 전에 모든 항목을 읽으려고합니까? 나는 당신의 디렉토리 읽기 함수를 for_each 함수로 바꿀 것이다.이 함수는 디렉토리 이름과 함수 포인터 그리고 void * 인자를 전달한다. 이 함수는 char * 인수를 취하여 읽기 디렉토리 이름 (또는 파일을 열어 FILE 또는 fd를 전달할 수 있음)과 void *를 취할 수 있습니다. 이 함수는 compare 함수를 호출합니다. – nategoose