ホームに戻る
 ファイル関連

#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;
}

inserted by FC2 system