C 仅使用扩展名搜索文件名

C 仅使用扩展名搜索文件名,c,linux,C,Linux,上一个问题描述得不好。 我需要检索一个文件名并将该名称分配给一个变量。唯一的问题是文件可以有任何名称。 我知道的是文件扩展名,这个扩展名只能有一个文件。 有没有办法在C中实现这一点 更新#1 文件扩展名是*.knb,目标是Linux系统 #include <stdio.h> #include <dirent.h> #define LOG_() do{fprintf(stdout, " UNIT TESTING...\n");}while(0) ch

上一个问题描述得不好。 我需要检索一个文件名并将该名称分配给一个变量。唯一的问题是文件可以有任何名称。 我知道的是文件扩展名,这个扩展名只能有一个文件。 有没有办法在C中实现这一点

更新#1 文件扩展名是
*.knb
,目标是Linux系统

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

#define LOG_() do{fprintf(stdout, " UNIT TESTING...\n");}while(0)

char* knbname;

void fName(void);

int main()
{
     LOG_();
     fName(void);

     //do some more code 

return 0;
}

void fName(void){
     DIR           *d;
     struct dirent *dir;
     d = opendir(".");
     if (d)
     {
        //find file with *.knb extension and place name into knbname
     }
     closedir(d);
}
#包括
#包括
#定义日志()do{fprintf(stdout,“单元测试…\n”);}while(0)
char*knbname;
无效fName(void);
int main()
{
LOG_u1;();
fName(无效);
//多做一些代码
返回0;
}
void fName(void){
DIR*d;
结构方向*dir;
d=opendir(“.”);
如果(d)
{
//查找扩展名为*.knb的文件,并将其置于knbname中
}
closedir(d);
}

我不知道如何在fName()函数中查找
*.knb
文件,以及如何为
knbname
指定名称。任何帮助都将不胜感激

在Andrew指出以前设计中的一些主要缺陷后,我将再次尝试解决方案

int hasExtension(char *filename, char *extension);

int main(void)
{
    DIR *directory;
    struct dirent *entry;

    if(NULL == (directory = opendir(".")))
    {
        perror("Failed to open directory\n");
        exit(1);
    }
    
    while( NULL != (entry = readdir(directory)) )
    {
        if(DT_REG == entry->d_type) { // Regualar files only
            if(hasExtension(entry->d_name, ".knb"))
            {
                printf("Match     - %s\n", entry->d_name);
            } else {
                printf("No match  - %s\n", entry->d_name);
            }
        }
    }
    closedir(directory);

    return 0;
}

int hasExtension(char *filename, char *extension)
{
    size_t filename_len, extension_len;

    if((NULL == filename) || (NULL ==extension))
        return 0;

    filename_len = strlen(filename);
    extension_len = strlen(extension);

    if(filename_len < extension_len)
        return 0;

    return !strcmp(filename + filename_len - extension_len, extension);
}
int-hasExtension(char*文件名,char*扩展名);
内部主(空)
{
DIR*目录;
结构方向*条目;
if(NULL==(directory=opendir(“.”))
{
perror(“打开目录失败\n”);
出口(1);
}
while(NULL!=(entry=readdir(目录)))
{
如果(DT_REG==entry->d_type){//仅限常规文件
if(hasExtension(条目->d_名称,.knb”))
{
printf(“匹配-%s\n”,条目->数据单元名称);
}否则{
printf(“不匹配-%s\n”,条目->数据单元名称);
}
}
}
closedir(目录);
返回0;
}
int hasExtension(字符*文件名,字符*扩展名)
{
大小\u t文件名\u len,扩展名\u len;
如果((NULL==文件名)| |(NULL==扩展名))
返回0;
filename\u len=strlen(文件名);
扩展名=strlen(扩展名);
如果(文件名
在Andrew指出之前设计中的一些主要缺陷后,我将再次尝试解决方案

int hasExtension(char *filename, char *extension);

int main(void)
{
    DIR *directory;
    struct dirent *entry;

    if(NULL == (directory = opendir(".")))
    {
        perror("Failed to open directory\n");
        exit(1);
    }
    
    while( NULL != (entry = readdir(directory)) )
    {
        if(DT_REG == entry->d_type) { // Regualar files only
            if(hasExtension(entry->d_name, ".knb"))
            {
                printf("Match     - %s\n", entry->d_name);
            } else {
                printf("No match  - %s\n", entry->d_name);
            }
        }
    }
    closedir(directory);

    return 0;
}

int hasExtension(char *filename, char *extension)
{
    size_t filename_len, extension_len;

    if((NULL == filename) || (NULL ==extension))
        return 0;

    filename_len = strlen(filename);
    extension_len = strlen(extension);

    if(filename_len < extension_len)
        return 0;

    return !strcmp(filename + filename_len - extension_len, extension);
}
int-hasExtension(char*文件名,char*扩展名);
内部主(空)
{
DIR*目录;
结构方向*条目;
if(NULL==(directory=opendir(“.”))
{
perror(“打开目录失败\n”);
出口(1);
}
while(NULL!=(entry=readdir(目录)))
{
如果(DT_REG==entry->d_type){//仅限常规文件
if(hasExtension(条目->d_名称,.knb”))
{
printf(“匹配-%s\n”,条目->数据单元名称);
}否则{
printf(“不匹配-%s\n”,条目->数据单元名称);
}
}
}
closedir(目录);
返回0;
}
int hasExtension(字符*文件名,字符*扩展名)
{
大小\u t文件名\u len,扩展名\u len;
如果((NULL==文件名)| |(NULL==扩展名))
返回0;
filename\u len=strlen(文件名);
扩展名=strlen(扩展名);
如果(文件名
您正在重新发明POSIX。以下是如何使用它的示例(有关更多选项,请参阅手册页中的标志):

#包括
内部主(空)
{
glob_t glob_res={0};
glob(“*.knb”、0、NULL和glob_res);
如果(glob_res.gl_pathc==0)放置(“不匹配”);
else printf(“第一个匹配是%s\n”,glob_res.gl_pathv[0]);
globfree(和glob_res);
返回0;
}

您正在重新发明POSIX。以下是如何使用它的示例(有关更多选项,请参阅手册页中的标志):

#包括
内部主(空)
{
glob_t glob_res={0};
glob(“*.knb”、0、NULL和glob_res);
如果(glob_res.gl_pathc==0)放置(“不匹配”);
else printf(“第一个匹配是%s\n”,glob_res.gl_pathv[0]);
globfree(和glob_res);
返回0;
}

添加一个
while((dir=readdir(d))!=NULL)
循环并比较
dir->d_name的值。(请注意,“dir”可能不是
struct dirent
的最佳名称,因为目录项不一定是目录,而且实际上您可能不关心目录,除非您想进行递归下降。)在@williampersell建议的循环中,您可以使用
strtok()解析每个目录项名称
(使用“.”作为分隔符)直到找到所需的扩展名。OT:不要这样排列变量。如果必须更改变量的类型,会发生什么情况?如果是多个变量呢?让他们重新排队会浪费很多时间。这段时间没有做任何有用的事情。您可以使用POSIX遍历目录树。您可以使用来匹配文件名glob。甚至不需要
strtok()
如果您只需要一个后缀,可以使用
strcmp()
根据长度将字符串的尾部对准正确的位置。添加
while((dir=readdir(d))!=NULL)
循环并比较
dir->d_name
的值。(请注意,“dir”可能不是
struct dirent
的最佳名称,因为目录项不一定是目录,而且实际上您可能不关心目录,除非您想进行递归下降。)在@williampersell建议的循环中,您可以使用
strtok()解析每个目录项名称
(使用“.”作为分隔符)直到找到所需的扩展名。OT:不要这样排列变量。如果必须更改变量的类型,会发生什么情况?如果是多个变量呢?让他们重新排队会浪费很多时间。这段时间没有做任何有用的事情。您可以使用POSIX遍历目录树。您可以使用来匹配文件名glob。甚至不需要
strtok()