C 仅使用扩展名搜索文件名
上一个问题描述得不好。 我需要检索一个文件名并将该名称分配给一个变量。唯一的问题是文件可以有任何名称。 我知道的是文件扩展名,这个扩展名只能有一个文件。 有没有办法在C中实现这一点 更新#1 文件扩展名是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
*.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()