我想得到一个我知道存在于某个文件夹中的文件的后缀(.txt,.png等)。 我知道文件名(前缀)在此文件夹中是唯一的。 语言是c ++。
感谢
答案 0 :(得分:3)
假设“suffix”是文件扩展名,您可以这样做:
char * getfilextension(char * fullfilename)
{
int size, index;
size = index = 0;
while(fullfilename[size] != '\0') {
if(fullfilename[size] == '.') {
index = size;
}
size ++;
}
if(size && index) {
return fullfilename + index;
}
return NULL;
}
这是C代码,但我相信可以很容易地移植到C ++(可能没有变化)。
getfilextension("foo.png"); /* output -> .png */
我希望这对你有所帮助。
<强>更新强>
如果等于您的目标,您将需要扫描目录中的所有文件并比较每个文件而不使用扩展名。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <limits.h>
#include <dirent.h>
#include <string.h>
//.....
char * substr(char * string, int start, int end)
{
char * p = &string[start];
char * buf = malloc(strlen(p) + 1);
char * ptr = buf;
if(!buf) return NULL;
while(*p != '\0' && start < end) {
*ptr ++ = *p++;
start ++;
}
*ptr++ = '\0';
return buf;
}
char * getfilenamewithoutextension(char * fullfilename)
{
int i, size;
i = size = 0;
while(fullfilename[i] != '\0') {
if(fullfilename[i] == '.') {
size = i;
}
i ++;
}
return substr(fullfilename, 0, size);
}
char * getfilextension(char * fullfilename)
{
int size, index;
size = index = 0;
while(size ++, fullfilename[size]) {
if(fullfilename[size] == '.') {
index = size;
}
}
if(size && index) {
return fullfilename + index;
}
return NULL;
}
char*FILE_NAME;
int filefilter(const struct dirent * d)
{
return strcmp(getfilenamewithoutextension((char*)d->d_name), FILE_NAME) == 0;
}
然后:
void foo(char * path, char * target) {
FILE_NAME = target;
struct dirent ** namelist;
size_t dirscount;
dirscount = scandir(path, &namelist, filefilter, alphasort);
if(dirscount > 0) {
int c;
for(c = 0; c < dirscount; c++) {
printf("Found %s filename,the extension is %s.\n", target, getfilextension(namelist[c]->d_name));
free(namelist[c]);
}
free(namelist);
} else {
printf("No files found on %s\n", path);
}
}
和主要代码:
int main(int argc, char * argv[])
{
foo(".", "a"); /* The .(dot) scan the current path */
}
对于包含此文件的目录:
a.c a.c~ a.out
a.o makefile test.cs
输出结果为:
Found a filename,the extension is .c.
Found a filename,the extension is .c~.
Found a filename,the extension is .o.
Found a filename,the extension is .out.
注意:scandir()
函数是GNU扩展/ GNU库的一部分,如果您的编译器上没有此函数,请告诉我将为其编写别名或使用{{3}实现(不要忘记阅读许可证)。
答案 1 :(得分:1)
如果您使用的是Windows,请使用PathFindExtension。
答案 2 :(得分:0)
在c ++中列出目录内容没有标准功能。因此,如果您知道应用程序中允许的扩展名,则可以迭代并查找文件是否存在。
其他选项是使用特定于操作系统的API或使用像Boost这样的东西。您还可以使用“ls | grep * filename”或“dir”命令转储并解析输出。