ホームに戻る
ファイル関連
#include <windows.h>
#include <stdio.h>
#define ID_B1 1000
#define ID_B2 1100
HANDLE hFileNotify = NULL;
HANDLE hThread = NULL;
// ファイル変更時にスレッドで呼ばれる関数
DWORD changedFile(LPDWORD param);
// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd, //ウィンドウハンドル(void型ポインタ)
UINT message, //メッセージ識別番号(unsigned int)
WPARAM wParam, //(32ビットlong)
LPARAM lParam); //(32ビットlong)
//メイン関数
int APIENTRY WinMain(
HINSTANCE hInstance, //インスタンスのハンドル
HINSTANCE hPreInstance, //以前のインスタンスハンドル
LPSTR cmdLine, //コマンド行の文字列
int cmdShow) //ウィンドウの表示状態
{
//ウィンドウクラスの宣言
WNDCLASS wd;
//ウィンドウクラス名
char *wdName = "window00";
//ウィンドウ登録のためのループ
if (!hPreInstance) {
//ウィンドウスタイル
wd.style = CS_HREDRAW | CS_VREDRAW; //幅、高さの変化に対し再描画する
//ウィンドウプロシージャ
wd.lpfnWndProc = (WNDPROC)WndProc;
//クラスの予備のメモリ領域
wd.cbClsExtra = 0;
//ウィンドウの予備のメモリ領域
wd.cbWndExtra = 0;
//プログラムのインスタンスハンドル
wd.hInstance = hInstance;
//アイコンのハンドル
wd.hIcon = NULL;
//カーソルのハンドル
wd.hCursor = LoadCursor(NULL, IDC_ARROW);
//バックグラウンドのブラシのハンドル
wd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//メニュー名
wd.lpszMenuName = NULL;
//クラス名
wd.lpszClassName = wdName;
//ウィンドウの登録(成功 非0、失敗 0)
if (!RegisterClass(&wd))
return FALSE;
}
//ウィンドウの生成(ハンドルを form00 とする)
HWND form00 = CreateWindowEx(
NULL, //拡張スタイル(なし)
wdName, //ウィンドウクラス名
"window", //ウィンドウの名前
WS_OVERLAPPEDWINDOW, //ウィンドウスタイル(オーバーラップ型)
CW_USEDEFAULT, //ウィンドウのX座標(ディフォルト)
CW_USEDEFAULT, //ウィンドウのY座標(ディフォルト)
200, //ウィンドウの幅(80に設定)
100, //ウィンドウの高さ(50に設定)
NULL, //親ウィンドウ(この場合自身が親)
NULL, //メニュー(なし)
hInstance, //プログラムのハンドル
NULL); //予備パラメータ
//ウィンドウの表示
ShowWindow(form00, cmdShow);
//ウィンドウの更新
UpdateWindow(form00);
//イベントのループ
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
//ボタンを2個宣言
HWND hButton1, hButton2;
//インスタンスハンドルを得る
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
switch (message) {
//ウィンドウを表示するとき処理
case WM_CREATE:
//ボタン1の表示
hButton1 = CreateWindow(
"BUTTON",
"Button1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10,
10,
80,
20,
hwnd,
(HMENU)ID_B1,
hInst
,NULL);
//ボタン2の表示
hButton2 = CreateWindow(
"BUTTON",
"Button2",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
100,
10,
80,
20,
hwnd,
(HMENU)ID_B2,
hInst
,NULL);
HANDLE hFile;
// ファイルを読み込みます 無ければ作ります
hFile = CreateFile("a.txt", // ファイル名
GENERIC_READ | GENERIC_WRITE, // 読み書き可
FILE_SHARE_READ, // 読み込み共有可
NULL, // SECURITY_ATTRIBUTESへのポインタ
OPEN_ALWAYS, // ファイルが無ければ生成
FILE_ATTRIBUTE_NORMAL, // 「読み取り専用」などの属性無し
NULL);
// ファイルサイズを得ます
int a;
a = GetFileSize(hFile, NULL);
// ファイルが空の時
if(a == 0){
int data = 1;
DWORD write;
// ファイル内ポインタを最初から0の位置に
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
// ファイル a.txt にint型の 1 を書きこみ
WriteFile(hFile, &data, sizeof(data), &write, NULL);
// 現在位置に EOF をセット
SetEndOfFile(hFile);
// ディレクトリ a を作成
if(!CreateDirectory("a", NULL)){
MessageBox(hwnd,
(LPCSTR)"ディレクトリaの作成に失敗",
(LPCSTR)"CreateDirectry",
MB_OK);
}
else{
MessageBox(hwnd,
(LPCSTR)"カレントにディレクトリaを作成",
(LPCSTR)"CreateDirectry",
MB_OK);
MessageBox(hwnd,
"カレントのa.txtをディレクトリaにコピー",
"Copy",
MB_OK);
// ファイルをコピー 第3引数が TRUE で上書き禁止
if(!CopyFile("a.txt", "a\\a.txt", TRUE)){
if(GetLastError() == ERROR_FILE_EXISTS &&
MessageBox(hwnd,
"すでにファイルが存在します\n上書きしますか?",
"すでにファイルが存在します",
MB_YESNO | MB_ICONQUESTION) == IDYES){
CopyFile("a.txt", "a\\a.txt", FALSE);
}
}
}
}
CloseHandle(hFile);
DWORD id;
// ディレクトリa内のファイルの最終更新時間が変更の時に通知
hFileNotify = FindFirstChangeNotification("a", TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE);
// 上の通知を待つスレッドを作成
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)changedFile, hwnd, 0, &id);
break;
//ボタンを押したときの処理
case WM_COMMAND:
switch(LOWORD(wParam)){
//ボタン1を押したとき
case ID_B1:
HANDLE hFind;
WIN32_FIND_DATA fd;
BOOL find_flag;
find_flag = TRUE;
// ディレクトリ a 内の最初のファイルを検索
hFind = FindFirstFile("a\\*.*", &fd);
// ファイルがあり find_flagが TRUE の時
while(hFind != INVALID_HANDLE_VALUE && find_flag){
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0){
char s[MAX_PATH + 3];
sprintf(s, "a\\%s", fd.cFileName);
DeleteFile(s);
MessageBox(hwnd,
(LPCSTR)"ディレクトリa内のファイルを1つ削除しました",
(LPCSTR)"button1",
MB_OK);
}
// 次のファイルを検索
find_flag = FindNextFile(hFind, &fd);
}
if(RemoveDirectory("a")){
MessageBox(hwnd,
(LPCSTR)"ディレクトリaを削除しました",
(LPCSTR)"button1",
MB_OK);
}
else{
MessageBox(hwnd,
(LPCSTR)"ディレクトリaの削除に失敗",
(LPCSTR)"button1",
MB_OK);
}
if(DeleteFile("a.txt") == TRUE){
MessageBox(hwnd,
(LPCSTR)"カレントのa.txtを削除しました",
(LPCSTR)"button1",
MB_OK);
}
else{
MessageBox(hwnd,
(LPCSTR)"カレントのa.txtの削除に失敗",
(LPCSTR)"button1",
MB_OK);
}
break;
//ボタン2を押したとき
case ID_B2:
char buffer[MAX_PATH + 1];
GetCurrentDirectory(MAX_PATH + 1, buffer);
MessageBox(hwnd,
(LPCSTR)buffer,
(LPCSTR)"CurrentDirectory is",
MB_OK);
break;
default:
return(DefWindowProc(hwnd, message, wParam, lParam));
}
break;
//ウィンドウを破壊する時の処理
case WM_DESTROY:
// スレッドを止める
if(hThread){
TerminateThread(hThread, 0);
}
// ファイル変更の通知を止める
if(hFileNotify){
FindCloseChangeNotification(hFileNotify);
}
//メイン関数のループを終了
PostQuitMessage(0);
break;
//デフォルトの処理に対してデフォルトの処理を返す
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}
// ファイル変更時にスレッドで呼ばれる関数
DWORD changedFile(LPDWORD param){
HWND hwnd = (HWND)param;
while(TRUE){
// ファイルの変更があるまで待機
if(WaitForSingleObject(hFileNotify, INFINITE) == WAIT_OBJECT_0){
MessageBox(hwnd,
(LPCSTR)"ディレクトリa内のファイルに変更がありました",
(LPCSTR)"FileNotify",
MB_OK);
}
// 次の変更を待つ
FindNextChangeNotification(hFileNotify);
}
return 0;
}