Windows C でファイル読み込み

非常になんとなく Windows の C でファイル読み込みするサンプル書いたので、忘れないようにメモ。

とりあえず以下の感じで・・・プログラム引数でごちゃごちゃ条件分岐させてるのは「共有モード」関連でちょっと調べたいことがあったからです。普通にファイル読み込むだけならこのあたりは無くても。

■ WinFileTest.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>

#pragma comment(lib, "kernel32.lib")

HANDLE openFile(DWORD shareMode);
void readFile(HANDLE hFile);

void main(int argc, char *argv[])
{
  DWORD shareMode;
  HANDLE hFile;

  if(argc != 2) {
    exit(-1);
  }

  if(strcmp(argv[1],"ex") == 0) {
    shareMode = 0;
  } else if (strcmp(argv[1],"read") == 0) {
    shareMode = FILE_SHARE_READ;
  } else if (strcmp(argv[1],"write") == 0) {
    shareMode = FILE_SHARE_WRITE;
  } else {
    exit(-1);
  }

  hFile = openFile(shareMode);
  getchar();
  readFile(hFile);
}

HANDLE openFile(DWORD shareMode)
{
  HANDLE hFile;

  hFile = CreateFile("hoge.txt",
                     GENERIC_READ,
                     shareMode,
                     NULL,
                     OPEN_ALWAYS,
                     FILE_ATTRIBUTE_NORMAL,
                     NULL);

  if(hFile == INVALID_HANDLE_VALUE ) {
    printf("CreateFile Error !!\n");
    printf("%s:%d\n", "errorcode", GetLastError());
    exit(-1);
  }
  
  return hFile;
}

void readFile(HANDLE hFile)
{
  LPVOID lpBuffer;
  DWORD readBuffer = 256;

  lpBuffer = (LPVOID)malloc(GetFileSize(hFile , NULL));
  if(0 == ReadFile(hFile, lpBuffer, readBuffer, &readBuffer, NULL)) {
    printf("ReadFile Error !!\n");
    printf("%s:%d\n", "errorcode", GetLastError());
    exit(-1);
  }

  printf("%s\n", lpBuffer);
}

・CreateFile 関数
https://msdn.microsoft.com/ja-jp/library/Cc429198.aspx
・ReadFile 関数
https://msdn.microsoft.com/ja-jp/library/Cc429679.aspx
・GetFileSize 関数
https://msdn.microsoft.com/ja-jp/library/Cc429319.aspx


ん~長らく C サボったせいで非常に手こずりました。やっぱり手に馴染むまでは定期的に書かないとダメですね・・・
「ファイル書き込み」バージョンはお暇なときにやろう。

以上です。