2012-04-30 8 views
0

私はいくつかのフォルダに存在することを知っているファイルの接尾辞(.txt、.pngなど)を取得したいと思います。 ファイル名(接頭辞)がこのフォルダ内で一意であることがわかりました。 言語はC++です。C++でファイルサフィックスを取得する方法は?

おかげ

+0

"ファイル名(接頭辞)は単数形です" - それはどういう意味ですか? –

+0

@OliCharlesworth:多分そのユニークな? – jman

+0

@skjaidev:はい、意味があります。 –

答えて

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 */ 

私はこれがあなたに役立つことを願っています。

UPDATE:

あなたは、ディレクトリのすべてのファイルをスキャンし、あなたのターゲットと等しい場合は拡張子のない各ファイルを比較する必要があるでしょう。

#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ライブラリの一部であり、私はそれのエイリアスを書き込むことを教えてくださいthisの実装を使用してください(ライセンスを忘れないでください)。

+0

ありがとうございます。しかし、状況は "fullfilename"という文字列がありませんが、Xという名前のフォルダにファイルがあり、その拡張子を知りたいだけです。 –

+0

WhileこれはC++で動作するCコードですので、 'std :: string'を使用して、ここで多くの作業を節約することができます。 – dreamlax

+0

@このリンクを使用することができます[どのようにしてファイルのリストを取得できますかCまたはC++を使用しているディレクトリにありますか?](http://stackoverflow.com/questions/612097/how-can-i-get-a-list-of-files-in-a-directory-using-c-or- c)それについて – CppLearner

0

C++でディレクトリの内容を一覧表示する標準機能はありません。したがって、アプリで拡張機能を使用できることが分かっている場合は、繰り返し実行してファイルが存在するかどうかを調べることができます。

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

関連する問題