none
【VC++2005】ワイルドカードで特定のファイルのみを抽出するやり方について RRS feed

  • 質問

  • ワイルドカードで、ある特定の拡張子を持つファイルのみを抽出したいです。

    例えば、以下のような環境です。

    ■Aフォルダ  ( C:\TEST\A\ )

    ※ 中身に以下の3ファイルがあるとします

    ---  test1.txt

    ---  test2.txtabc

    ---  test3.txt123

    ■やりたい事

    Aフォルダから"test1.txt" のみをワイルドカードで抽出する。

    ■現状の作り

            Aフォルダから3ファイル全て抽出される。

            関数: FindFirstFile (指定されたファイル名に一致するファイルを、ディレクトリ内で検索)を使用している。

        ☆ 第1引数: ファイル名 ( C:\TEST\A\*.txt )

    ☆ 第2引数:  データバッファ

        *.txt の部分のワイルドカードを変えて、拡張が、”.txt” のファイルのみ検索したいのですが、"*" や "?"

              などではできないのでどうしたらできるかわからないでいます。

         ご教授の程よろしくお願い致します。

    2012年9月12日 2:45

回答

  • FindFirstFile/FindNextFile の制約により、*.txt で検索すると、4文字以上の拡張子のものもすべてヒットします。

    ですので、それを前提として、ヒットしたファイルの拡張子を取得し(PathFindExtension APIなど)、その文字列を lstrcmpi など、大文字小文字を区別しない文字列比較関数を用いて一致確認または、文字数を確認(lstrlenなど)します。

    あとは、3文字以上の場合も扱いを等しくするか。。。ですね。

    そのあたりはプログラム的な問題もあるので、一致させていいのか?というところは別途検討する必要があると思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 佐伯玲 2012年9月14日 4:29
    • 回答としてマーク 佐伯玲 2012年9月18日 0:41
    2012年9月12日 4:13

すべての返信

  • FindFirstFile/FindNextFile の制約により、*.txt で検索すると、4文字以上の拡張子のものもすべてヒットします。

    ですので、それを前提として、ヒットしたファイルの拡張子を取得し(PathFindExtension APIなど)、その文字列を lstrcmpi など、大文字小文字を区別しない文字列比較関数を用いて一致確認または、文字数を確認(lstrlenなど)します。

    あとは、3文字以上の場合も扱いを等しくするか。。。ですね。

    そのあたりはプログラム的な問題もあるので、一致させていいのか?というところは別途検討する必要があると思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 佐伯玲 2012年9月14日 4:29
    • 回答としてマーク 佐伯玲 2012年9月18日 0:41
    2012年9月12日 4:13
  • 早速のご回答ありがとうございました。

    FindFirstFile ” 一行の処理で、".txt"の拡張子を持つファイルのみ抽出するのは無理そう(ワイルドカードなし)なのでPathFindExtensionで、1ファイルずつ拡張子をチェックし、該当しないファイルをはじくように作り変える事にしました。

    お忙しいところご教授頂きましてありがとうございました。大変参考になりました。


    2012年9月12日 7:46