ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2018年12月17日(月) 23:21

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月20日(日) 07:45 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
多くの方が既にご自身で実装してそうですが、ファイル読み書きクラスを投稿してみます。

ReadFile(), WriteFile() を使う際の、
いちいち必要な変数を定義する面倒&バッファを確保する手間から解放されます。
・・・後者はちょっと語弊があるかも?(^^;
※Ascファイル(.txtとか.htmlとか)が対象です。

[hide=クラスの定義はこちら。]
コード:
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
[/hide]

使い方はこんな感じです。
コード:
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以外の属性のとき
エラーしてました。修正しました。


(いつものように?)蛇足。
無性にクラスを使ってみたくなったから組んだ、それが全てだったり(^^。
ファイル読み書き周りで、バッファの解放を忘れていたのにずっと気付かず、凹んでいるからかもしれません┐(´ー`)┌


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 1 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke