如何在c ++中获取文件后缀?

时间:2012-04-30 20:15:08

标签: c++

我想得到一个我知道存在于某个文件夹中的文件的后缀(.txt,.png等)。 我知道文件名(前缀)在此文件夹中是唯一的。 语言是c ++。

感谢

3 个答案:

答案 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”命令转储并解析输出。