gpt4 book ai didi

c - 在 C (Linux) 中的目录上迭代和 "store"文件的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:34 26 4
gpt4 key购买 nike

我编写了一个函数来检查文件是否重复。这个函数签名是:

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 可能会失败。

对此有任何意见。我想选择最有效的路径,并访问尽可能少的资源。这是程序的要求...

编辑:有没有办法获取某个目录中的文件数,而无需遍历它?

最佳答案

您可能想使用散列或校验和;创建每个文件内容的散列,并将每个散列与具有该散列的文件名列表相关联。然后,当你构造一个散列时,你会看到还有哪些其他文件也共享相同的散列。只有当你发生冲突时,你才真正需要比较完整的文件。如果您选择了一个好的散列函数,那么冲突应该相对较少,使得完全比较很少见。

请注意,散列大小和冲突次数之间存在权衡;如果您使用较小的散列,冲突可能会更频繁,但每个文件使用的空间较少,如果您使用较大的散列,那么您将不得不进行较少的完整文件比较,但需要坚持和比较更大的哈希值。此外,一些散列函数比其他散列函数导致更少的冲突,但是一些更好的散列函数可能比更差的散列函数更耗时和计算密集。

一种有效的文件和目录遍历方法是使用ftw。或 nftw .

关于c - 在 C (Linux) 中的目录上迭代和 "store"文件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2697090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com