ファイル読み込み・書き込みAPIプログラム

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

ファイル読み込み・書き込みAPIプログラム

投稿記事 by naohiro19 » 11年前

CODE:

//File.h
#pragma once

#include 
#include 

HANDLE CreateFileWriteReadA(LPCSTR lpszFileName, BOOL DoRead);
HANDLE CreateFileWriteReadW(LPCWSTR lpszFileName, BOOL DoRead);

#ifdef _UNICODE
#define CreateFileWriteRead CreateFileWriteReadW
#else
#define CreateFileWriteRead CreateFileWriteReadA
#endif

CODE:

//File.cpp
#include "File.h"

HANDLE CreateFileWriteReadA(LPCSTR lpszFileName, BOOL DoRead)
{
	return CreateFileA(lpszFileName, DoRead ? GENERIC_READ : GENERIC_WRITE, DoRead ? FILE_SHARE_READ : FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}

HANDLE CreateFileWriteReadW(LPCWSTR lpszFileName, BOOL DoRead)
{
	return CreateFileW(lpszFileName, DoRead  ? GENERIC_READ : GENERIC_WRITE, DoRead ? FILE_SHARE_READ : FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
このCreateFileWriteRead関数はCreateFile関数を内部で使っているラッピング関数でDoReadにTRUEを設定すると「GENERIC_READ」と「FILE_SHARE_READ」に設定され、このフラグをFALSEにすると「GENERIC_WRITE」と「FILE_SHARE_WRITE」に設定されます。ファイルハンドルが帰ってくるのでCloseHandleを呼び出して解放してあげてください。

YuO
記事: 947
登録日時: 14年前

Re: ファイル読み込み・書き込みAPIプログラム

投稿記事 by YuO » 11年前

2点ほど。
  • 書き込み時のdwShareModeは,FILE_SHARE_WRITEよりも0の方がよいです
    FILE_SHARE_WRITEを指定して書き込みモードで開くと言うことは,複数のプロセスが書き込みモードで開ける,ということになります。
    つまり,あるプロセスが出力した内容と,別のプロセスが出力した内容がまざって出力される可能性がある,ということになります。
    これは,たいていの場合好ましくない動作になります (共有のログファイルを開く場合なら,追記モードでありかもしれない)。
  • 読み込み時のdwCreationDispositionは,OPEN_ALWAYSかOPEN_EXISTINGにした方がよいです
    CREATE_ALWAYSはファイルを作り直すため,読み込めるサイズが常に0バイトになってしまいます。