はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ フォルダ操作

あいさつ

どうも、はかせです。

今回はフォルダ操作する際に使う
カレントディレクトリの取得と移動
フォルダの生成
フォルダの削除

この三つをWinAPIを用いて実装します。

この辺の操作が出来れば
必要なものを自動でセッティングしてくれるツール
が作れるようになります。

「開発楽にするためにツール作ってるけど
セッティングが毎度ゴタついてめんどうなんだよなー」

っていうそこのあなた必見ですよ。

include

今回作成したプログラムで使用する
includeはこちらです

#include <Windows.h>

WinAPIを使うので
Windows.hは必須ですね。

カレントディレクトリの取得と移動

実装の前にカレントディレクトリとはなんぞやってとこからですね。

カレントディレクトリってのは
現在自分がいるディレクトになります。

基本的にフォルダやファイルの操作ってのは
カレントディレクトリ基準の相対パスで扱うことが多いです。
(絶対パスでも行けますがめんどくさいし環境の変化に弱い)

なのでフォルダ操作とカレントディレクトリってのは
切っても切り離せない関係にあります。

さてカレントディレクトリについて説明が終わったところで
実際にどうやるのかって話に行きましょう。

まずは取得

char cdir[255];
GetCurrentDirectory(255, cdir);

現在のカレントディレクトリを取得するには
GetCurrentDirectoryを使用します。

cdirはバッファになります。
ここに取得したパスが格納されるわけです。

サイズは255にしてますが、
特に深い理由はありません。
パス格納するだけなんだから255もあれば
足りるだろうという脳筋思考です。
(C++も変数を配列要素数に使用できるようになってもいいと思うんだけどなぁ)

次に移動です。

SetCurrentDirectory("移動するフォルダ名orパス");

カレントディレクトリの移動には
SetCurrentDirectoryを使用します。

こいつは先述のGetCurrentDirectoryと違ってバッファなんていりません。
ただ素直に行きたいフォルダの名前を指定してやれば
そこに移動してくれます。楽ちんですね。

フォルダ移動なので
パスを使って一気に遠くに行くこともできます。

フォルダの生成

カレントディレクトリを自由自在に移動できるようになったところで
今度はフォルダを生成してみましょう。

CreateDirectory("生成するフォルダ名orパス", NULL);

生成にはCreateDirectoryを使用します。
フォルダ名を渡すとその名前のフォルダが
カレントディレクトリの直下にできます。

もちろんフォルダ名のところに
パスを入れればそのパスにフォルダができます。

第二引数にNULLが入っていますが、
ここにはWIndowsセキュリティを入れます。
NULL入れるとマウスで右クリックから作ったのと
同じ設定になります。

フォルダの削除

創造と破壊は表裏一体、
生成をできるようになったら次は削除です。

RemoveDirectory("削除するフォルダ名orパス");

削除にはRemoveDirectoryを使用します。
引数はフォルダ名orパスです。
指定したフォルダが削除されます。

あとがき

今回はWinAPIを使用した
フォルダ操作でした。

WinAPIはレガシー臭はするものの
結構素直な動きをしてくれますね。
あと命名も直感的で良きです。

さすが天下のMicrosoftですね。
(テノヒラクルー)

ちなみに各メソッドの成否は
戻り値のBOOLを見てあげればわかるようになっています。
GetCurrentDirectoryだけはDWORDで長さが返ってきますが、
渡したバッファの中身見れば済むだけのことです。

今回はC++でやりましたが、
C#でも似たようなことはできますし、
dll作って他の言語やツールで使ってもいいです。
一個やり方がわかれば他の言語や環境でも使える
スキルや資産になるのがツール系のいいところですよね。
(需要があれば過去に私が作ったツールの紹介でもしますかね)

それでは今回はこの辺でノシ