ReadFile(), WriteFile() を使う際の、
いちいち必要な変数を定義する面倒&バッファを確保する手間から解放されます。
・・・後者はちょっと語弊があるかも?(^^;
※Ascファイル(.txtとか.htmlとか)が対象です。
クラスの定義はこちら。 [ここをクリックすると内容が表示されます]
使い方はこんな感じです。
コード: 全て選択
Class WsFileReadWrite
	pReadSource As BytePtr 'ファイル読み取りバッファ
	pWriteSource As BytePtr 'ファイル書き込みバッファ
	nBytesRead As DWord '読み込んだバイト数
	hHeap As DWord 'ヒープハンドル
	fContentsTF As Long '読み込み済みフラグ
	fOutBufferTF As Long '書き込み準備完了フラグ
Public
	'コンストラクタ
	Sub WsFileReadWrite()
		hHeap = HeapCreate( NULL, NULL, NULL )
		fContentsTF = FALSE
		fOutBufferTF = FALSE
	End Sub
	'デストラクタ
	Sub ~WsFileReadWrite()
		Dim retAns As Long
		retAns = HeapDestroy( hHeap )
	End Sub
	'ファイルを読み込む
	Function OpenFile( pTargetFile As BytePtr ) As Long
		Dim retAns As Long
		Dim hFile As DWord
		Dim nSize As DWord
		'ターゲットファイルをオープン
		hFile = CreateFile( pTargetFile,
							GENERIC_READ,
							0,
							ByVal NULL,
							OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL,
							NULL )
		If( hFile=INVALID_HANDLE_VALUE  )Then
			OpenFile = FALSE
			ExitFunction
		EndIf
		'ファイルサイズを得る。
		nSize = GetFileSize( hFile, 0 )
		'読み取りバッファの確保
		If( fContentsTF=FALSE )Then
			pReadSource = HeapAlloc( hHeap, HEAP_ZERO_MEMORY, nSize + 4*2 )
		Else
			retAns = HeapFree( hHeap, NULL, pReadSource )
			pReadSource = HeapAlloc( hHeap, HEAP_ZERO_MEMORY, nSize + 4*2 )
		EndIf
		'ファイルを全てバッファに読み込む。
		retAns = ReadFile( hFile, _
							pReadSource, _
							nSize, _
							VarPtr( nBytesRead ), _
							ByVal NULL )
		'読み取りが終了したのでファイルをクローズ
		retAns = CloseHandle( hFile )
		fContentsTF = TRUE
		OpenFile = TRUE
	EndFunction
	'読み込みバッファを開放
	Function CloseFile() As Long
		Dim retAns As Long
		retAns = HeapFree( hHeap, NULL, pReadSource )
		fContentsTF = FALSE
	EndFunction
	'読み込んだバイト数を得る
	Function WhatByte() As Long
		Dim retAns As Long
		If( fContentsTF=FALSE )Then
			WhatByte = NULL
		Else
			WhatByte = nBytesRead
		EndIf
	EndFunction
	'読み込んだ内容を得る。
	Function GetContents() As BytePtr
		If( fContentsTF=FALSE )Then
			GetContents = NULL
		Else
			GetContents = pReadSource
		EndIf
	EndFunction
	'読み込んだ内容をコピーする
	Function CpyContents( pTargetBuf As BytePtr ) As Long
		Dim pMark As Long
		If( fContentsTF=FALSE )Then
				CpyContents = FALSE
		Else
			pMark = lstrcpy( pTargetBuf, pReadSource )
			If( pMark=NULL )Then
				CpyContents = FALSE
			Else
				CpyContents = TRUE
			EndIf
		EndIf
	EndFunction
	'書き込む内容をセットする
	Function SetContents( pBuffer As BytePtr ) As Long
		Dim nSize As DWord
		Dim pMark As BytePtr
		Dim retAns As Long
		nSize = lstrlen( pBuffer ) + 1
		If( fOutBufferTF=FALSE )Then
			pWriteSource = HeapAlloc( hHeap, HEAP_ZERO_MEMORY, nSize )
		Else
			retAns = HeapFree( hHeap, NULL, pWriteSource )
			pWriteSource = HeapAlloc( hHeap, HEAP_ZERO_MEMORY, nSize )
		EndIf
		
		pMark = lstrcpy( pWriteSource, pBuffer )
		If( pMark=NULL )Then
			SetContents = FALSE
		Else
			SetContents = TRUE
		EndIf
		fOutBufferTF = TRUE
	EndFunction
	'セットされた内容を書き込む
	Function WriteContents( pTargetFile As BytePtr ) As Long
		Dim retAns As Long
		Dim hFile As DWord
		Dim nSize As DWord
		Dim nBytesWrite As DWord
		If( fOutBufferTF=FALSE )Then
			WriteContents = FALSE
		EndIf
		'書き込み先を上書きオープン
		hFile = CreateFile( pTargetFile,
							GENERIC_WRITE,
							0,
							ByVal NULL,
							CREATE_ALWAYS,
							GetFileAttributes( pTargetFile ),
							NULL )
		If( hFile=INVALID_HANDLE_VALUE  )Then
			WriteContents = FALSE
			ExitFunction
		EndIf
		'バッファのデータをファイルに書き込む。
		retAns = WriteFile( hFile,
							pWriteSource,
							lstrlen( pWriteSource ),
							VarPtr( nBytesRead ),
							ByVal NULL )
		'書き込みが終了したのでファイルのクローズ
		retAns = CloseHandle( hFile )
		retAns = HeapFree( hHeap, NULL, pWriteSource )
		fOutBufferTF = FALSE
		WriteContents = TRUE
	EndFunction
End Classコード: 全て選択
Dim rw As WsFileReadWrite
Dim r As Long
Dim p As BytePtr
'ファイルを読み込む
r = rw.OpenFile( "FilePath" )
p = rw.GetContents() '読み込んだファイル内容のポインタを返す(使用は推奨しませんが)
debug
'必要なバイト数を確保して、
'読み込んだファイル内容をコピーする
p = calloc( rw.WhatByte() + 1 )
r = rw.CpyContents( p )
debug
'気になるなら、読み込んだ内容をメモリから破棄
r = rw.CloseFile()
debug
'ファイルへの書き込み。
r = rw.SetContents( "hogetest" )
r = rw.WriteContents( "FilePath" )
debug
End失敗ならFALSE or NULLです。
11/20 20:34修正しました。
「CreateRead(), CreateWrite() を使う際の、」って書いてました。
なんですかそれ・・・(汗)。徹夜明けだったのでボケてたみたいです( ̄▽ ̄;)
06/24 13:12修正しました。
書き込み先のファイルがFILE_ATTRIBUTE_NORMAL以外の属性のとき
エラーしてました。修正しました。
(いつものように?)蛇足。
無性にクラスを使ってみたくなったから組んだ、それが全てだったり(^^。
ファイル読み書き周りで、バッファの解放を忘れていたのにずっと気付かず、凹んでいるからかもしれません┐(´ー`)┌