ぴぐノート

Good code is its own best documentation.

MFC

【Visual C++】フルパスを指定してフォルダー階層を作成する。

投稿日:2016年11月16日 更新日:

MFCなどでファイル走査などのプログラミングを行っていると、D&D(ドラッグアンドドロップ)されたフォルダー内の全ファイル(サブフォルダー含め)に何か処理を行い、同じような階層を維持したまま別のフォルダーに写し取りたい場合があります。

  1. 以下のフォルダーに格納されている全ファイル(サブフォルダー含め)にXXX処理を行う。
    “C:\\Users\\user\\Documents\\workspace\\”
  2. 処理が終われば以下のフォルダーに出力する。
    尚、”user”以下のフォルダー構成は維持する。
    “C:\\image\\”

この場合、「”C:\\image\\user”があるか?」、「なければ作る」といった処理が必要になります。

フォルダー構成がコピーできればファイルごとの比較などもしやすくなります
サンプルプログラムを見ながら実装してみましょう。

どんなソースコードになる?

もっとスマートに記述できるような気もするのですが…。
あまり時間もかけられない関係上、以下のような内容でフルパスからフォルダー構成をコピーできます。

サンプルコードでは「Win32 コンソールアプリケーション」で確認していますが、CStringなどで確認できたのでMFCでも問題なく実行できるはずです。
ボタンのイベントハンドラーにコーディングすれば簡単にテストできるかと思います。

処理内容の解説

フォルダーの出現位置取得

上記コード、18行目の部分です。

CString::Find関数は、引数で指定した文字(文字列)が一致した場所を返す関数です。

関連リンク:CStringT::Find

第二引数のnCountは「検索を開始する文字列のインデックス」を指定します。
ループの最後でインクリメントしているのはこの検索開始位置をずらすためです。

また戻り値で-1が返ってきた場合(=見つからなかった)、ループから脱出し処理を終了します。

各フォルダーのパスを取得

フォルダーを作成する関数、_mkdir(_wmkdir)関数は引数に「作成するフォルダのパス」を指定する必要があります。

関連:_mkdir、_wmkdir

そのため、”C:\\image\\user\\Documents”であれば、

  • “C:\\”
  • “C:\\image”
  • “C:\\image\\user”
  • “C:\\image\\user\\Documents”

の4パターンが必要になります。
(「C:\\」や「C:\\image」などは冗長な気もしますが…。)

引数には「CString::Left関数」と「フォルダーの出現位置」から上記4パターンを取得しています。

関連リンク:CStringT::Left

今回は戻り値をチェックせず、作れなかった場合の処理は記述していません。
作れなかった場合には、

  • 既にフォルダが存在する
  • 指定されたフォルダーに到達できない(「C:」がないなど)

などがあります。
エラー処理が必要な場合は適宜追加してください。

まとめ

作成しようと思ったのは、一つのフォルダーをMFCにD&Dして、そのフォルダーに含まれる全ての画像ファイルを変換する作業からでした。
サブフォルダーもかなりあり、フォルダー構成もまるごとコピーできれば比較などもしやすいためでした。

先述したようにもっとスマートに、エレガントに記述できるような気もするのですが、現状ではこの操作で動かしてみようと思います。

スポンサーリンク

スポンサーリンク

-MFC

執筆者:

関連記事

【MFC入門】ダイアログにファイルをドラッグアンドドロップしよう【Visual C++】

ファイル操作を行うツールなどを作成する際には、ファイルをドラッグアンドドロップできると便利です。 ファイルがどこにあるか分からない場合などは参照させることも多いと思いますが、プログラムやファイルの検証 …

【MFC入門】ツリーコントロールでフォルダ内のファイルを表示しよう【Visual C++】

エクスプローラーのディレクトリー構成などツリーコントロールの活用場面は多いです。 ドラッグアンドドロップされたフォルダーに格納されている、フォルダー/ファイルを表示できれば、どのファイルにアクセスする …

【MFC入門】メッセージボックスにエラーコードを表示させよう

ライブラリなどを使用していると、戻り値にエラーコードを返す関数は比較的多いです。 GetLastError関数(最新のエラーコードを取得する関数)がライブラリに含まれていることもありますが、そうでない …

【MFC】マルチスレッドでプログレスバーを実装しよう その1

実は今回紹介する方法は、もしかしたら正しくないのかもしれません。 ダイアログベースのプログラムで以下の条件を満たし、プログレスバーを表示したいと考えました。 スレッド実行中はモーダルダイアログを表示さ …

【MFC入門】MFCについて知ろう【Visual C++】

Windowsのアプリ開発で最もポピュラーな開発環境はやはりMFCでしょうか。 MFC(Microsoft Foundation Class)とはVisual Studioに組み込まれているアプリケー …