多くの方が既にご自身で実装してそうですが、ファイル読み書きクラスを投稿してみます。
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
GetContents(), WhatByte() 以外の返り値は、成功ならTRUE、
失敗ならFALSE or NULLです。
11/20 20:34修正しました。
「CreateRead(), CreateWrite() を使う際の、」って書いてました。
なんですかそれ・・・(汗)。徹夜明けだったのでボケてたみたいです( ̄▽ ̄;)
06/24 13:12修正しました。
書き込み先のファイルがFILE_ATTRIBUTE_NORMAL以外の属性のとき
エラーしてました。修正しました。
(いつものように?)蛇足。
無性にクラスを使ってみたくなったから組んだ、それが全てだったり(^^。
ファイル読み書き周りで、バッファの解放を忘れていたのにずっと気付かず、凹んでいるからかもしれません┐(´ー`)┌