>> WINAPI入門トップに戻る

ディレクトリの移動、作成、削除

今回はディレクトリの移動、作成、削除について説明します。

ファイルを作成したり、読み込んだりする時は、
まずカレントディレクトリを参照してファイルを探します。
カレントディレクトリとは今自分が居るディレクトリのことを指します。

カレントディレクトリを取得するには、GetCurrentDirectory関数を使います。

DWORD GetCurrentDirectory(
DWORD nBufferLength, // ディレクトリバッファのサイズ
LPTSTR lpBuffer // ディレクトリバッファ
);

第一引数にはファイルパスを格納するバッファのサイズを、
第二引数にはそのバッファを指定します。

また、カレントディレクトリを移動させるには、SetCurrentDirectory関数を使います。

BOOL SetCurrentDirectory(
LPCTSTR lpPathName // 新しいカレントディレクトリ
);

引数には移動したいディレクトリの名前を指定します。
絶対パスでも相対パスでも構いません。

次にディレクトリの作成ですが、CreateDirectory関数を使います。

BOOL CreateDirectory(
LPCTSTR lpPathName, // ディレクトリ名
LPSECURITY_ATTRIBUTES lpSecurityAttributes // セキュリティ識別子
);

第一引数にディレクトリ名を指定します。
今現在のカレントディレクトリがABCだとして、DDDという名前を指定すると、
ABCの直下にそのフォルダが作成されます。
第二引数はNULLで構いません。デフォルトのセキュリティ識別子が自動的に使われます。

最後にディレクトリの削除ですが、RemoveDirectory関数を使います。

BOOL RemoveDirectory(
LPCTSTR lpPathName // ディレクトリ名
);

ディレクトリのパスを指定します。相対パスでも絶対パスでも構いません。
削除対象のディレクトリは空である必要があります。
何かファイルが存在すると関数が失敗しますのでご注意下さい。

上記の関数を使ったコードのサンプルが以下になります。

#include <windows.h>
#include <stdio.h>

#define MSG(m) {\
	MessageBoxA(NULL,m,NULL,MB_OK);}

//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;

//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300



LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
	char buf[1000];



	switch(msg){
		case WM_DESTROY:

			PostQuitMessage(0);
			return 0;

		case WM_LBUTTONDOWN:

			//カレントディレクトリを取得
			GetCurrentDirectory(sizeof(buf),buf);

			MSG(buf);

			//ディレクトリを作成
			CreateDirectory("temp",NULL);

			//作ったディレクトリへ移動
			SetCurrentDirectory("temp");

			//表示
			GetCurrentDirectory(sizeof(buf),buf);
			MSG(buf);

			//削除
			//一旦親フォルダへ移動
			SetCurrentDirectory("..");
			RemoveDirectory("temp");

			GetCurrentDirectory(sizeof(buf),buf);
			MSG(buf);
	

			return 0;

		
	}
	return DefWindowProc(hwnd,msg,wp,lp);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
	MSG msg;
	WNDCLASS wc;

	wc.style=CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc=WinProc;
	wc.cbClsExtra=wc.cbWndExtra=0;
	wc.hInstance=hInstance;
	wc.hCursor=wc.hIcon=NULL;
	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wc.lpszClassName="test";
	wc.lpszMenuName=NULL;
	
	if(!RegisterClass(&wc)){
		MSG("クラスの登録失敗");
		return -1;
	}

	
	//インスタンスハンドル
	hinst=hInstance;

	hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
		0,0,400,400,NULL,NULL,hInstance,NULL);


	if(hwnd==NULL){
		MSG("ウィンドウ作成失敗");
		return -1;
	}


	//エラーチェック用変数
	int check;

	while(check=GetMessage(&msg,NULL,0,0)){
		if(check==-1){
			break;
		}
		DispatchMessage(&msg);
	}

	//クラス解放
	UnregisterClass("test",hinst);

	return 0;

}

上記のコードを実行して、クライアント領域上で左クリックを押すと、
現在のカレントディレクトリを表示し、その後その直下に「temp」というフォルダを作成します。
その後、そのフォルダへカレントディレクトリにした後、そのパスを表示します。
最後に親フォルダへ戻って、作成したディレクトリを削除しています。

ディレクトリの移動、作成、削除の方法は理解できましたでしょうか?
次回はファイルの作成、削除について説明します。


>> 【ファイルの作成、削除】に進む
>> WINAPI入門トップに戻る