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语言编出遍历出某个目录以及其子目录下所有以TXT为扩展名的文本文件