データの読み書き          <TOP>


ファイルからデータを読み込み、またファイルへデータを書き込みます。

CreateFile 指定したファイルをオープンし、デバイスハンドルを返す

ReadFile ファイルからデータを読み取る

WriteFile データをファイルに書き出す

SetFilePointer開いているファイルのポインタを移動

CloseHandle オープンされているオブジェクトハンドルをクローズ

 

左:初期状態(フォルダC:\Tempにファイル名MyText.txtを指定)    右:内容を入力

 

左:「保存」ボタンをクリック    右:確認メッセージ表示(「はい」選択で保存される。一旦「×」で終了させる)

 

左:再度起動し「開く」をクリック(保存されているのが確認できる)    右:文字列を追加・・

 

 

'================================================================
'= データの読み書き
'=    (WriteFile.bas)
'================================================================
#include "Windows.bi"

' 指定したファイルをオープンし、デバイスハンドルを返す
Declare Function Api_CreateFile& Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName$, ByVal dwDesiredAccess&, ByVal dwShareMode&, lpSecurityAttributes As Any, ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, ByVal hTemplateFile&)

' ファイルからデータを読み取る
Declare Function Api_ReadFile& Lib "kernel32" Alias "ReadFile" (ByVal hFile&, lpBuffer As Any, ByVal nNumberOfBytesToRead&, lpNumberOfBytesRead&, lpOverlapped&)

' データをファイルに書き出す
Declare Function Api_WriteFile& Lib "kernel32" Alias "WriteFile" (ByVal hFile&, lpBuffer As Any, ByVal nNumberOfBytesToWrite&, lpNumberOfBytesWritten&, lpOverlapped As Any)

' 開いているファイルのポインタを移動
Declare Function Api_SetFilePointer& Lib "kernel32" Alias "SetFilePointer" (ByVal hFile&, ByVal lDistanceToMove&, lpDistanceToMoveHigh&, ByVal dwMoveMethod&)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "kernel32" Alias "CloseHandle" (ByVal hObject&)

#define FILE_BEGIN 0                    'ファイルポインタがファイルの先頭がファイルの先頭からオフセットぶんだけ移動
#define FILE_CURRENT 1                  '現在のファイルポインタの位置
#define FILE_END 2                      'ファイルの終端が移動の開始点
#define FILE_ATTRIBUTE_ARCHIVE &H20     'アーカイブ属性を示す定数
#define FILE_ATTRIBUTE_COMPRETSED &H800 '圧縮属性を示す定数
#define FILE_ATTRIBUTE_DIRECTORY &H10   'ディレクトリ属性
#define FILE_ATTRIBUTE_HIDDEN &H2       '隠しファイル属性
#define FILE_ATTRIBUTE_NORMAL &H80      '他のファイル属性を持たない
#define FILE_ATTRIBUTE_READONLY &H1     '読み込み専用属性
#define FILE_ATTRIBUTE_SYSTEM &H4       'システムファイル属性
#define FILE_ATTRIBUTE_TEMPORARY &H100  '一時ファイル属性を示す定数
#define FILE_CASE_PRESERVED_NAMES &H2   '
#define FILE_CASE_SENSITIVE_SEARCH &H1  '
#define FILE_FILE_COMPRESSION &H10      '
#define FILE_FLAG_DELETE_ON_CLOSE &H4000000 'そのファイルを指すすべてのファイルのハンドルがクローズされた時に、そのファイルを削除するように指定
#define FILE_FLAG_NO_BUFFERING &H20000000   'システムキャッシュを使用せずにファイルをオープンするように指定
#define FILE_FLAG_OVERLAPPED &H40000000     '時間のかかる処理に対してReadFile関数やWriteFile関数でERROR_IO_PENDING拡張エラーを返すようにする
#define FILE_FLAG_POSIX_SEMANTICS &H1000000 'POSIXの規則に従ってファイルにアクセス
#define FILE_FLAG_RANDOM_ACCESS &H10000000  'ファイルにランダムアクセスすることをシステムに示す
#define FILE_FLAG_SEQUENTIAL_SCAN &H8000000 'ファイルにシーケンシャルアクセスすることをシステムに示す
#define FILE_FLAG_WRITE_THROUGH -2147483648 'キャッシュに書き込まれたデータをそのまま直接ディスクに書き込むようにする(&H80000
#define FILE_SHARE_READ &H1             '後続のオープン操作で読み取りアクセスが要求された場合、そのオープンを許可
#define FILE_SHARE_WRITE &H2            '後続のオープン操作で書き込みアクセスが要求された場合、そのオープンを許可
#define GENERIC_READ -2147483648        '読み込みモード(&H80000000)
#define GENERIC_WRITE &H40000000        '書き込みモード
#define CREATE_ALWAYS 2                 '新しいファイルを作る(存在する場合には上書)
#define CREATE_NEW 1                    '新しいファイルを作る(存在する場合は失敗)
#define OPEN_ALWAYS 4                   'ファイルをオープンする(存在しない場合作成)
#define OPEN_EXISTING 3                 'ファイルをオープンする(存在しない場合失敗)
#define TRUNCATE_EXISTING 5             'ファイルをオープンし、ファイルのサイズを0バイトにする

Var Shared Edit(1) As Object
Var Shared Text(1) As Object
Var Shared Button(1) As Object

For i = 0 To 1
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
    Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) : Button(i).SetFontSize 14
Next i

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Edit(0).SetWindowText "C:\Temp\MyText.txt"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hFile As Long
    Var FilePath As String
    Var Buffer As String * 1024
    Var lRead As Long
    Var Ret As Long
   
    FilePath = Edit(0).GetWindowText
    If FilePath = "" Then Exit Sub

    hFile = Api_CreateFile(FilePath, GENERIC_READ, FILE_SHARE_READ, ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, 0)
   
    Edit(1).SetWindowText ""
    Do
        Ret = Api_ReadFile(hFile, Buffer, Len(Buffer), lRead, ByVal 0)
        Edit(1).SetWindowText Edit(1).GetWindowText & Left$(Buffer, lRead)
        CallEvent
    Loop until lRead < Len(Buffer)
      
    Ret = Api_CloseHandle(hFile)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var hFile As Long
    Var FilePath As String
    Var Buffer As String * 1024
    Var lWrite As Long
    Var Ret As Long
  
    FilePath = Edit(0).GetWindowText
    If FilePath = "" Then Exit Sub

    A% = MessageBox("保存", "保存しますか?", 4, 1)
    If A% = 6 Then Exit Sub
   
    hFile = Api_CreateFile(FilePath, GENERIC_WRITE, FILE_SHARE_READ, ByVal 0, TRUNCATE_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)
   
    Ret = Api_SetFilePointer(hFile, 0, ByVal 0, FILE_BEGIN)
   
    If Len(Edit(1).GetWindowText) > 1024 Then
        For i = 0 To Len(Edit(1).GetWindowText) / 1024
            Buffer = Left$(Edit(1).GetWindowText, 1024)
            Edit(0).SetWindowText Mid$(Edit(1).GetWindowText, 1025)
            Ret = Api_WriteFile(hFile, Buffer, Len(Buffer), lWrite, ByVal 0)
        Next i
    End If
    Ret = Api_WriteFile(hFile, Edit(1).GetWindowText, Len(Edit(1).GetWindowText), lWrite, ByVal 0)
   
    Ret = Api_CloseHandle(hFile)
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    End
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End