【问题标题】:In C, checking for existence of file with name matching a pattern在 C 中,检查名称与模式匹配的文件是否存在
【发布时间】:2017-07-29 13:24:07
【问题描述】:

我已经看到了一些在 C 中检查文件是否存在的方法。但是,我看到的所有内容都适用于特定的文件名。我想检查任何与特定模式匹配的文件。例如,模式可能是“lockfile*”,而“lockfileA”、“lockfile.txt”或“lockfile.abc”将在检查中注册。我目前这样做的方法是使用 opendir() 打开目录,然后循环通过 readdir() 并尝试将模式与返回的每个文件的名称匹配。它有效,但我肯定想要一种更紧凑的方式来做到这一点。有什么想法吗?

【问题讨论】:

  • 就是这样,鲍勃
  • @ammoQ 感谢您的支持!
  • shell 文件搜索实用程序使用通配符。一种方法是将这样的命令传递给带有重定向输出的shell,然后分析它创建的文件。但这是一种可怕的方式。
  • popen("ls -1 lockfile*", "r")

标签: c file-exists


【解决方案1】:

您可以使用glob(3)(由 POSIX 标准化)。你给它一个通配符模式,它会在文件系统中搜索匹配项。

示例:

#include <glob.h>
#include <stdio.h>

int main(int argc, char **argv)
{
   glob_t globbuf;
   if (0==glob(argv[1], 0, NULL, &globbuf)){
       char **a=globbuf.gl_pathv;

       puts("MATCHES");
       for(;*a;a++)
           puts(*a);
   }
   globfree(&globbuf);
}

跑步:

./a.out 'lockfile*'

应该给你你的锁文件。

【讨论】:

  • 谢谢!很高兴知道:) 但效率真的很差吗?它不是检查所有地方吗?
  • lockfile* 将触发递归根树搜索。您将在几个小时内准备好比赛。开玩笑。当然它不会“检查所有地方”。试试看。
  • 哈哈是的,但它是如何工作的?它如何映射 fs 以便不必检查所有目录?
  • 如果您有lockfile* 之类的模式,则需要遍历当前目录并查找匹配名称。 glibc 的实现使用readdir() + fnmatch()
【解决方案2】:

据我所知,应该这样做。

对于文件的每个名称d_name,您可以检查它的长度,如果它至少有 8 个字符,strcmp 将前 8 个字符添加到 lockfile

您也可以使用&lt;regex.h&gt; 进行检查。

至于迭代,我相信这是他最好的方法。

【讨论】:

  • 谢谢。试图接受你的回答,但 Stack 告诉我我必须等五分钟。如果我忘记了,请提醒我!
  • 您应该查看@PSkocik 的answer。您在问题中提供了一个 glob 模式,他将您指向 **glob**(3)。
猜你喜欢
  • 2010-10-13
  • 2021-05-13
  • 1970-01-01
  • 2011-04-27
  • 2014-05-23
  • 2019-02-06
  • 2018-11-23
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多