1

I want to get the suffix(.txt,.png etc.) of a file that I know that exists in some folder. I know that the file name(prefix) is unique in this folder. The language is c++.

thanks

4

3 に答える 3

3

「接尾辞」がファイル名拡張子であると仮定すると、次のことができます。

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 ライブラリの一部です。コンパイラでこの関数を使用できない場合は、エイリアスを作成するか、この実装を使用することを教えてください (ライセンスを読むことを忘れないでください)。 .

于 2012-04-30T20:24:14.653 に答える
1

Windows を使用している場合は、PathFindExtensionを使用します。

于 2012-04-30T20:28:09.663 に答える
0

C++ でディレクトリの内容を一覧表示する標準機能はありません。したがって、アプリで許可されている拡張子がわかっている場合は、ファイルが存在するかどうかを反復して見つけることができます。

その他のオプションは、OS 固有の API を使用するか、Boost などを使用することです。「ls | grep *filename」または「dir」コマンド ダンプを使用して、出力を解析することもできます。

于 2012-04-30T20:30:28.427 に答える