2

我目前正在使用一个代码示例,该示例最初旨在获取一个参数,然后在当前目录中搜索该参数,我试图通过替换 ". " 使用“/dev/shm”,但是当我搜索某些东西时,代码什么也没有出现*(注意通配符)。通配符搜索在当前目录中工作正常,所以我认为问题不是通配符,如果有人可以帮助我,我将非常感激,谢谢!

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>


static void lookup(const char *arg)
{
    DIR *dirp;
    struct dirent *dp;


    if ((dirp = opendir(".")) == NULL) {
        perror("couldn't open '.'");
        return;
    }


    do {
        errno = 0;
        if ((dp = readdir(dirp)) != NULL) {
            if (strcmp(dp->d_name, arg) != 0)
                continue;


            (void) printf("found %s\n", arg);
            (void) closedir(dirp);
                return;


        }
    } while (dp != NULL);


    if (errno != 0)
        perror("error reading directory");
    else
        (void) printf("failed to find %s\n", arg);
    (void) closedir(dirp);
    return;
}


int main(int argc, char *argv[])
{
    int i;
    for (i = 1; i < argc; i++)
        lookup(argv[i]);
    return (0);
}
4

2 回答 2

6

opendir不处理通配符。它需要一个真实的目录路径。我不确定你说的是什么意思

通配符搜索适用于当前目录

如果你的意思是它可以在你的 shell 中工作,那是可以预料的。shell 将首先扩展通配符,然后执行您键入的命令。

那么如何解决这个问题呢?glob在调用之前自己扩展通配符opendir


编辑:对不起,我以为你试图匹配目录名称中的通配符。看起来您想使用通配符匹配目录内容。在这种情况下,只需更换

if (strcmp(dp->d_name, arg) != 0)

if (fnmatch(arg, dp->d_name, 0) != 0)

你也可以用glob这个。它实际上将替换调用opendir和循环。这是一个使用示例glob

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


static void lookup(const char *root, const char *arg)
{
    size_t n;
    glob_t res;
    char **p;

    chdir(root);
    glob(arg, 0, 0, &res);

    n = res.gl_pathc;
    if (n < 1) {
        printf("failed to find %s\n", arg);
    } else {
        for (p = res.gl_pathv; n; p++, n--) {
            printf("found %s\n", *p);
        }
    }
    globfree(&res);
}


int main(int argc, char *argv[])
{
    int i;
    for (i = 2; i < argc; i++)
        lookup(argv[1], argv[i]);
    return (0);
}
于 2012-05-21T01:59:05.257 回答
1

我不确定你在期待什么。如果您的程序被调用lookup,那么如果您在“当前目录”中调用它,该目录包含文件 something.1、something.2 和 something.3,如下所示:

lookup something*

外壳会将其扩展为

lookup  something.1 something.2 something.3

并且您的程序将看到三个命令行参数,并且能够在 readdir 循环中找到匹配项。

如果您将 opendir 调用更改为 "/dev/shm" 并从原始目录(具有某些内容的目录。[1-3])调用它,那么 shell 将再次扩展通配符in the current directory。但是除非文件something.1、something.2 和something.3 也存在于/dev/shm 中,否则readdir 循环将看不到它们。

请注意,您的查找功能有点奇怪。我希望它更像这样:

    static int lookup(const char * dir, const char *arg)
    {
        DIR *dirp;
        struct dirent *dp;

        if ((dirp = opendir(dir)) == NULL) {
            perror(dir);
            return -1;
        }

        while ((dp = readdir(dirp)) != NULL) {
            if (!strcmp(dp->d_name, arg)) {
                break;
            }
        }
        (void) closedir(dirp);

        printf("%s %s\n", dp ? "found" : "failed to find", arg);
        return 0;
    }
于 2012-05-21T02:42:43.093 回答