C++】フルパスを指定してフォルダー階層を作成する。C++】フルパスを指定してフォルダー階層を作成する。2016年11月17日MFCなどでファイル走査などのプログラミングを行っていると、D&D(ドラッグアンドドロップ)されたフォルダー内の全ファイル(サブフォルダー含め)に何か処理を行い、同じような階層を維持したまま別のフォルダーに写し取りたい場合があります。以下のフォルダーに格納されている全ファイル(サブフォルダー含め)にXXX処理を行う。“C:\\Users\\user\\Documents\\workspace\\”処理が終われば以下のフォルダーに出力する。”user”以下のフォルダー構成は維持する。“C:\\image\\”この場合、「”C:\\image\\user”があるか?」、「なければ作る」といった処理が必要になります。フォルダー構成がコピーできればファイルごとの比較などもしやすくなります。サンプルプログラムを見ながら実装してみましょう。まとめどんなソースコードになる?もっとスマートに記述できるような気もするのですが...。時間もかけられない関係上、以下のような内容でフルパスからフォルダー構成をコピーできます。任意のファイルのフルパス。実務上は処理対象のファイルパス。どこからフォルダー構成をコピーするか。C:\\image\\user...)を取得・作成する。失敗した(=作成できなかった)場合はエラーコードが返るので必要なら取得します。任意のファイルのフルパス。実務上は処理対象のファイルパス。どこからフォルダー構成をコピーするか。C:\\image\\user...)を取得・作成する。失敗した(=作成できなかった)場合はエラーコードが返るので必要なら取得します。コンソールアプリケーション」で確認していますが、CStringなどで確認できたのでMFCでも問題なく実行できるはずです。ボタンのイベントハンドラーにコーディングすれば簡単にテストできるかと思います。上記コード、18行目の部分です。nCount);CString::Find関数は、引数で指定した文字(文字列)が一致した場所を返す関数です。関連リンク:CStringT::Find第二引数のnCountは「検索を開始する文字列のインデックス」を指定します。ループの最後でインクリメントしているのはこの検索開始位置をずらすためです。戻り値で-1が返ってきた場合(=見つからなかった)、ループから脱出し処理を終了します。C:\\Users\\user...)を取得・作成する。失敗した(=作成できなかった)場合はエラーコードが返るので必要なら取得します。C:\\Users\\user...)を取得・作成する。失敗した(=作成できなかった)場合はエラーコードが返るので必要なら取得します。_wmkdir(output.Left(nCount));フォルダーを作成する関数、_mkdir(_wmkdir)関数は引数に「作成するフォルダのパス」を指定する必要があります。“C:\\”“C:\\image”“C:\\image\\user”“C:\\image\\user\\Documents”の4パターンが必要になります。(「C:\\」や「C:\\image」などは冗長な気もしますが...。)引数には「CString::Left関数」と「フォルダーの出現位置」から上記4パターンを取得しています。関連リンク:CStringT::Left今回は戻り値をチェックせず、作れなかった場合の処理は記述していません。フォルダが存在する指定されたフォルダーに到達できない(「C:」がないなど)などがあります。エラー処理が必要な場合は適宜追加してください。まとめ作成しようと思ったのは、一つのフォルダーをMFCにD&Dして、そのフォルダーに含まれる全ての画像ファイルを変換する作業からでした。サブフォルダーもかなりあり、フォルダー構成もまるごとコピーできれば比較などもしやすいためでした。先述したようにもっとスマートに、エレガントに記述できるような気もするのですが、現状ではこの操作で動かしてみようと思います。【OpenCV】MFCのピクチャーコントロールに描画しよう!前回、OpenCVを使って画像の回転や二値化などを行って動作確認をしました。C++】Windowsのアプリ開発で最もポピュラーな開発環境はやはりMFCでしょうか。C++】ファイル操作を行うツールなどを作成する際には、ファイルをドラッグアンドドロップできると便利です。...【MFC入門】メッセージボックスにエラーコードを表示させようライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。出力先の指定などフォルダー選択のダイアログを表示させたいことがあります。フォルダー選択ダイアログを表示させるためには、SHBrowseForFolder関数を使います。