2011-10-26 7 views
0

こんにちは私はあまりにも特定のテキストファイルのファイル拡張子をチェックする方法を実装しようとしています以下のコードは私が欲しいものを行うように見えないが、これはこれを行うにはやや正しい方向ですか?そうでなければ、できるだけ少ないコードでこれを行うことができるライブラリがあります。 Windows上のこれはどのようにして特定のテキストファイルのファイル拡張子をチェックするのですか?

string fn = ".txt"; 
if(fn.substr(fn.find_last_of(".") + 1) == ".txt") { 
    fprintf(stderr,"yes"); 
} else { 
    fprintf(stderr,"no"); 
} 

イム7 32bit版

+0

これをcoutとcinでタグ付けしましたが、標準エラーに 'fprintf'を使用しました。実際には標準エラーのためのiostreamクラスがありますので、 'cerr <<" yes ";'と 'cerr <<" no ";' – HostileFork

+0

ところで、あなたはファイル内のファイル拡張子をチェックしません " msgstr "ファイル名の/ in"。 –

+1

ファイル拡張子にプログラム的にアクセスすることは、通常、ファイル名を誤って使用することになります。ユーザーは、ファイル名として必要なものを置くことができます。 notes.txt.oldを入力すると、プログラムが動作しなくなります。この方法でファイル名の悪用をやめ、ファイル形式のメタデータを正常に保存するようにOSベンダーに指示してください。 – bames53

答えて

1

fn.substr(fn.find_last_of(".") + 1)戻っドットなし"txt"。そのため、ドットがない場合はsubstrから+1を削除するか、"txt"と比較してください。

+1

ちょうど "txt"をお勧めします。速く、すでにドットを比較しています。 –

+2

...ファイル名にドットが含まれていない場合は 'find_last_of()'は 'npos'を返し、nposは定数-1として定義されているので、このコードはそれに1を加えて' substr 0) '。したがって、書かれているように、ドットのない文字列の「拡張子」は、ファイル名全体になります。なぜなら、このコードによって意図的に表現されていないような理由があります。 – HostileFork

0

私はブーストファイルシステムライブラリ(拡張パス機能)を助けるべきだと思います。マイナスは、 を示唆するよう

http://www.boost.org/doc/libs/release/libs/filesystem/index.html

+0

私は主に、すべてのソースと私とビルドソースが上に乗っていないので、私は主に試してみると、boostary libaryを得ることができませんでした:(誰かがmingwのバイナリをビルドしていれば、 – NoobScratcher

+0

あなたはこのガイドhttp:// www .boost.org/doc/libs/1_43_0/more/getting_started/windows.htmlしかし、それはmingwと動作するように保証されていません。 – minus

1

私の好ましい解決策は、boost::filesystemだろうが、ない場合:

static std::string const targetExtension(".txt"); 
if (filename.size() >= targetExtension.size() 
     && std::equal(filename.end() - targetExtension.size(), 
         filename.end(), 
         targetExtension.begin())) { 
    std::cerr << "yes"; 
} else { 
    std::cerr << "no"; 
} 

これは私には最も単純に思われます。

1

Windowsでのみ動作する必要がある場合は、Win32 API PathMatchSpecを使用するのが最善の解決策です。ご例えば

string fn = ".txt"; 
if(PathMatchSpecA(fn.c_str(), "*.txt") { 
    fprintf(stderr,"yes"); 
} else { 
    fprintf(stderr,"no"); 
} 

または関数として:

BOOL HasTxtFileExtension(LPCSTR filename) 
{ 
    return PathMatchSpecA(filename, "*.txt"); 
} 

予想されるように、この関数は、大文字と小文字を区別しないで、正しくディレクトリにドットが含まれている場合を処理しますが、ファイルはありません。 C:\\directory.with.dots\\testtxt

関連する問題