ab.com コミュニティ https://www.activebasic.com/forum/ |
|
[AB4]ファイルの読み書きクラス https://www.activebasic.com/forum/viewtopic.php?t=476 |
ページ 1 / 1 |
作成者: | 淡幻星 [ 2005年11月20日(日) 07:45 ] |
記事の件名: | [AB4]ファイルの読み書きクラス |
多くの方が既にご自身で実装してそうですが、ファイル読み書きクラスを投稿してみます。 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 EndGetContents(), WhatByte() 以外の返り値は、成功ならTRUE、 失敗ならFALSE or NULLです。 11/20 20:34修正しました。 「CreateRead(), CreateWrite() を使う際の、」って書いてました。 なんですかそれ・・・(汗)。徹夜明けだったのでボケてたみたいです( ̄▽ ̄;) 06/24 13:12修正しました。 書き込み先のファイルがFILE_ATTRIBUTE_NORMAL以外の属性のとき エラーしてました。修正しました。 (いつものように?)蛇足。 無性にクラスを使ってみたくなったから組んだ、それが全てだったり(^^。 ファイル読み書き周りで、バッファの解放を忘れていたのにずっと気付かず、凹んでいるからかもしれません┐(´ー`)┌ |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |