C语言获取文件扩展名

Posted

技术标签:

【中文标题】C语言获取文件扩展名【英文标题】:Getting file extension in C language 【发布时间】:2010-06-14 06:02:36 【问题描述】:

假设有一个名为 12345.jpg 的文件。在 C 中,如何获取文件扩展名以便与某些文件扩展名进行比较?如果有任何内置功能,请告诉我。

【问题讨论】:

SO 290488 涵盖了很多相同的领域。 这就是 - ***.com/questions/51949/… Getting file extension in C的可能重复 【参考方案1】:

执行此操作的函数以及测试工具:

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

const char *getExt (const char *fspec) 
    char *e = strrchr (fspec, '.');
    if (e == NULL)
        e = ""; // fast method, could also use &(fspec[strlen(fspec)]).
    return e;


int main (int argc, char *argv[]) 
    int i;
    for (i = 1; i < argc; i++) 
        printf ("[%s] - > [%s]\n", argv[i], getExt (argv[i]));
    
    return 0;

运行这个:

./program abc abc. abc.1 .xyz abc.def abc.def.ghi

给你:

[abc] - > []
[abc.] - > [.]
[abc.1] - > [.1]
[.xyz] - > [.xyz]
[abc.def] - > [.def]
[abc.def.ghi] - > [.ghi]

【讨论】:

+1 表示strrchr。查找字符串中字符的最后一个实例的最佳方法。 以防万一有人错过。 getExt() 假定 fspec 是基本名称,而不是完整路径。考虑例如my.dir/file。使用basename() 从完整路径中获取基本名称。【参考方案2】:

大概:

#include <string.h>

char *extn = strrchr(filename, '.');

这将为您提供一个指向扩展周期的指针,如果没有扩展,则为您提供一个空指针。您可能需要做更多的尽职调查,以确保点后没有斜线等。

【讨论】:

strrchr(filename+1,'.'); 将处理像 .svn 这样以点开头但没有扩展名的名称。 @drawnonward - 毫无疑问,如果您认为这是一个没有扩展名的文件名,而不是没有名字的扩展名。这是另一个需要考虑的“尽职调查”案例。但是,如果 OP 想要将找到的扩展名与相当短的已知扩展名列表进行比较,那么 .svn 不在列表中的事实意味着它可能无论如何都无关紧要。 @drawnonward:我误解了你的意思——你的观点很有道理。但是,这对于以“/”开头的绝对路径名或包含斜杠 (subdir/.svn) 的相对名称没有帮助。有一种情况说您需要找到文件基本名称的开头(在最后一个斜杠之后,但您必须担心尾随斜杠和根),然后查找不在第一个位置的点。我猜这意味着父目录“..”的名称为“点”,后跟以点开头的扩展名,仅此而已......通常还有另一个曲线球要处理。 @drawnonward 如果文件名是空字符串,可能会导致分段错误。【参考方案3】:

有一个便携式 CRT 解决方案:_splitpath。

在 Windows 中还有一个未记录的 shell32 API,称为 PathGetExtension,但这在很多方面都是邪恶的,我可能不应该注意到这一点。

【讨论】:

这显然是我以前不知道的“便携”这个词的一些新定义 :-) 向 HHGTTG 声名的道格拉斯亚当斯道歉。 确实,从未在同一句话中看到过“便携”一词和指向 msdn 的链接:-) 我的错,我的错!不会编辑答案,供其他人欣赏:) 嗯,是的,答案仍然有用,所以我不会编辑它。如果您在 MS 平台上,最好使用 _splitpath 而不是自己编写(例如在我的回答中)。 当然 - 我考虑过移除“便携式”(我的头在哪里,真的吗?)但放弃了。【参考方案4】:

使用 strchr 第一个数组成员会给你文件名 第二个数组成员会给你扩展

【讨论】:

以上是关于C语言获取文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何判断文件类型?

用C语言编出遍历出某个目录以及其子目录下所有以TXT为扩展名的文本文件

汇编语言源文件有几个扩展名?

C语言源程序文件经过编译连接之后生成一个后缀为_____的文件。

为啥c语言程序是对的可以运行,可是目标文件找不到?

C语言与Go语言有什么区别?