>> WINAPI入門トップに戻る

ファイルのコピー、移動

今回はファイルのコピー、移動について説明します。

ファイルのコピーは、CopyFile関数を使います。

BOOL CopyFile(
LPCTSTR lpExistingFileName, // 既存のファイルの名前
LPCTSTR lpNewFileName, // 新しいファイルの名前
BOOL bFailIfExists // ファイルが存在する場合の動作
);

第三引数をTRUEにするとコピー先のに同じ名前のファイルがあった場合、
コピーされずに関数が失敗します。
FALSEを指定すると上書きされて、関数は失敗しません。

次に、ファイルやディレクトリの移動は、MoveFile関数を使います。

BOOL MoveFile(
LPCTSTR lpExistingFileName, // ファイル名
LPCTSTR lpNewFileName // 新しいファイル名
);

この関数はディレクトリの移動も可能です。
なおディレクトリの移動に関してはドライブを指定することが出来ません。
ファイルに関しては別ドライブを指定可能です。

また、ファイルのサイズを取得する関数として、GetFileSize関数があります。

DWORD GetFileSize(
HANDLE hFile, // ファイルのハンドル
LPDWORD lpFileSizeHigh // ファイルサイズの上位ワード
);

ファイルのハンドルにはCreateFile関数を使ってGENERIC_READ等を指定して得たファイルハンドルを指定します。
第二引数にはDWORD型のポインタを指定します。
4GB以上のファイルはDOWRD型だけでは表せないので、
4GB以上のファイルはサイズの上位ワードだけをこの第二引数に格納させます。
下位ワードは戻り値として戻ってきます。
ファイルサイズが4GB以下だと分かっている場合は、NULLを指定して構いません。
ファイルサイズが4GB以下の場合は戻り値がそのままサイズになります。

ファイルのコピーと移動を表現したコードが以下のコードになります。

#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];
	
	static HANDLE h;


	switch(msg){
		case WM_DESTROY:

			PostQuitMessage(0);
			return 0;

		case WM_LBUTTONDOWN:

			h = CreateFile("test.txt",GENERIC_WRITE,0,NULL,
				CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

			if(h!=INVALID_HANDLE_VALUE){
				MSG("ファイル作成に成功しました");

				CloseHandle(h);

				//ファイルをtest2という名前で同じ階層にコピー
				if(!CopyFile("test.txt","test2.txt",FALSE)){
					MSG("関数失敗");
				}

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

				if(!MoveFile("test2.txt","./temp/test2.txt")){
					MSG("関数失敗");
				}
			}

			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;

}

これを実行すると、test.txtのファイルを作成したあと、
同じフォルダにtest2.txtというファイルを作成し、
tempフォルダ作成後に、tempフォルダにtext2.txtファイルを移動します。

以上がファイルのコピー、移動になります。

次回はファイルの列挙について説明します。


>> 【ファイルの列挙】に進む
>> WINAPI入門トップに戻る