Autoit 入門書

Autoit の基礎 – ファイルの読み取り、書き込みと内容の削除

ファイルの読み取り、書き込みと内容の削除

Autoit では、内部関数を使用してファイルの読み取り、書き込みと削除ができます。

ファイルの読み取りと書き込みを行う前に、 Windows のファイルには拡張子というファイルの種類を識別するための文字列があるということを覚えておきましょう。

ここでは拡張子「.TXT」(テキストファイル)と「.INI」(設定ファイル)の読み取り、書き込みと内容の削除を勉強していきます。

INIファイルの読み取りと書き込み、削除

AutoIt でINIファイルの読み取り、書き込みを行うには、内部関数の IniWrite 、 IniRead を使用します。

INIファイルの読み取り、書き込み

IniRead:.INIファイルから値を読み取ります。

形式:IniRead( “ファイル名”, “セクション”, “キー”, “デフォルト値” )

IniWrite:.INIファイルに値を書き込みます。

形式:IniWrite ( “ファイル名”, “セクション”, “キー”, “書き込みまたは変更する値” )

この 2つの関数には共に 4つのパラメータがあります。

三つ目までは同じですが、4つ目のパラメータが違います。

書き込みをする場合は”書き込みまたは変更する値” 、読み取りをする場合は”デフォルト値”。

“デフォルト値” = 要求したキーが見つからなかった場合、デフォルト値が返されます。

つまり、何も指定せず “” のみにすれば、指定したキーのデフォルト値を取得することができるということです。

INIファイルはアプリケーションの設定ファイルとして筆者もよく使用しています。

この 2つの関数は難しくはありませんので、理解しやすいと思います。

次のサンプルをご覧ください。

; デスクトップに test.ini ファイルを作成し、データを書き込みます。

IniWrite(@DesktopDir & "\test.ini", "setup", "test", "haha")

; 先ほど書き込んだデータを test.ini ファイルから読み取ります。

$a1 = IniRead(@DesktopDir & "\test.ini", "setup", "test", "")

; 存在しないデータを読み取ります。

$a2 = IniRead(@DesktopDir & "\test.ini", "setup", "test2", "デフォルト")
MsgBox(0, "", "testキーのデータ: " & $a1 & @LF & "test2キーのデータ: " & $a2)

; test.ini ファイルから読み取ります。

$a1 = IniRead(@DesktopDir & "\test.ini", "setup", "test", "こんにちは")

MsgBox(0, "", "testキーのデータ: " & $a1)

実際に実行し、結果を確認してみましょう。

$a2 には、パラメータ4 で指定した”デフォルト” が代入されているのがわかると思います。

これは $a2 では存在しないキーのデータを読み取っているので、失敗しているのが原因です。

一番最後のコードではパラメータ4 に ”こんにちは” を指定していますが、$a1 には ”haha” が代入されています。

これは $a1 で要求したキーが存在し、読み取りに成功しているため ”こんにちは” は無視され、存在するデータが代入されているのです。

デスクトップに作成された test.ini ファイルを開いて内容を確認してみましょう。

test.ini の内容

INIファイルの値を削除

INIファイルのキー、データを削除するには IniDelete 関数を使用します。

IniDelete 関数:INIファイルから値を削除します。

形式:IniDelete ( “ファイル名”, “セクション” [, “キー”] )

IniDelete には3つのパラメータがあり、3番目は省略可能です。

3番目を省略すると指定したセクションを削除することになります。

test.ini ファイルを閉じて次のコードを実行してみましょう。

; test キーを削除します。

IniDelete(@DesktopDir & "\test.ini", "setup", "test")

; セクション setup を削除します。

IniDelete(@DesktopDir & "\test.ini", "setup")

test.ini ファイルを開いて内容を確認してみましょう。

セクション名の読み取り

IniReadSectionNames 関数:INIファイル内のすべてのセクション名を読み取ります。

形式:IniReadSectionNames ( “ファイル名” )

; デスクトップに test.ini ファイルを作成し、データを書き込みます。

IniWrite(@DesktopDir & "\test.ini", "setup", "test", "haha")
IniWrite(@DesktopDir & "\test.ini", "setup2", "test2", "huhu")
IniWrite(@DesktopDir & "\test.ini", "setup3", "test3", "hehe")

$var = IniReadSectionNames(@DesktopDir & "\test.ini")

If @error Then
    MsgBox(4096, "", "INIファイルの読み取りに失敗しました")
Else
    For $i = 1 To $var[0]
        MsgBox(4096, "", " セクション名 :" & $var[$i])
    Next
EndIf
test.ini の内容

実行して結果を確認してみましょう。

キーおよびデータの読み取り

IniReadSection 関数:INIファイルの指定したセクション下から全てのキー、データを読み取ります。

IniDelete(@DesktopDir & "\test.ini", "setup")
IniDelete(@DesktopDir & "\test.ini", "setup2")
IniDelete(@DesktopDir & "\test.ini", "setup3")

IniWrite(@DesktopDir & "\test.ini", "setup", "test", "haha")
IniWrite(@DesktopDir & "\test.ini", "setup", "test2", "hihi")
IniWrite(@DesktopDir & "\test.ini", "setup", "test3", "huhu")

$var = IniReadSection(@DesktopDir & "\test.ini", "setup")

If @error Then
    MsgBox(4096, "", "INIファイルの読み取りに失敗しました")
Else
    For $i = 1 To $var[0][0]
        MsgBox(0, "", "キー名 : " & $var[$i][0] & @LF & " データ : " & $var[$i][1])
    Next
EndIf
test.ini の内容

返し値は2次元配列です。

$var[n][0] がキー名、$var[n][1] がデータになります。(n とは1~それ以上)

INIファイルの読み取り、書き込みは必ずしも拡張子「.INI」でなければならないということはありません。

TXTファイルでも内容が INIファイルの形式であれば読み書きすることができます。

TXTファイルの読み取り、書き込みと内容の削除

AutoIt でテキストファイルの読み取り、書き込みを行うには、次の内部関数を使用します。

  • FileOpen ( “ファイル名” [, モード] )
  • FileClose ( ファイルのハンドル)
  • FileWrite ( “ファイルのハンドル/ファイル名”, “データ” )
  • FileWriteLine ( “ファイルのハンドル/ファイル名”, “テキスト行” )
  • FileRead ( “ファイルのハンドル/ファイル名” [, 読み込む文字数] )
  • FileReadLine ( “ファイルのハンドル/ファイル名” [, 読み取る行数] )

TXTファイルの読み取り、書き込み

;ファイルを書き出しモード(追加書き込み)で開きます。

$file = FileOpen(@DesktopDir & "\test.txt", 1)
;~ $file にはファイルハンドル情報が入っています。

; テキストファイルの最後にテキストを追加します。

FileWriteLine($file, "一行目のテキスト")

; さらにテキストファイルの最後にテキストを追加します。

FileWrite($file, "2行目のテキスト")

FileClose($file) ; 必ずファイルハンドルを閉じてください。

上記のコードではテキストファイルを FileOpen 関数、1 = 書き出しモード(追加書き込み) で開いています。


$file = FileOpen(@DesktopDir & "\test.txt", 0)

; テキストファイルから最初の4文字を読み取ります。

$var1 = FileRead(@DesktopDir & "\test.txt", 4)

; 2行目のデータを読み取ります。

$var2 = FileReadLine(@DesktopDir & "\test.txt", 2)

MsgBox(0, "", "最初の4文字: " & $var1 & @LF & "2行目のデータ : " & $var2)

FileClose($file) ; 必ずファイルハンドルを閉じてください。

上記のコードではテキストファイルを FileOpen 関数、0 = 読み込みモード (デフォルト) で開いています。

読み取りモードで開いたファイルには、FileWrite 等でデータを書き込むことはできません。

また、書き込みモードで開いたファイルを読み取ることはできません。

FileOpen 関数を使用してファイルを開いた後は、必ず FileClose 関数でファイルハンドルを閉じてください。

上記のコードを実行すると気付くと思いますが、結果の「最初の4文字」が「一?」となって文字化けしていますね。

これはテキストファイルの文字コードが ANSI であるため。

Autoit テキストファイルを書き込むと文字コードが「Unicode」に変わって文字化けしてしまう

さらに「最初の4文字」を読み取るためにパラメータ 2 で 4 を指定しているのに 2文字しか読み取れていないのは文字コードのバイト数(半角を 1 全角を 2 と認識している)が関係しています。

次のコードは FileRead 関数で読み込む文字数をしていませんので、テキストファイルの内容をすべて読み取ります。


; ファイルを読み込みモード (デフォルト)で開きます。
$file = FileOpen(@DesktopDir & "\test.txt", 0)

; ファイルが読み取り可能かどうかをチェック
If $file = -1 Then
    MsgBox(0, "エラー", "ファイルを開けません")
    Exit
EndIf

MsgBox(0, "すべてのデータ", FileRead($file))

FileClose($file) ; 必ずファイルハンドルを閉じてください。

次のサンプルは間違った書き方の見本です。

実際に実行し、コードを見てどこが間違っているか確認してみましょう。

$file = FileOpen(@DesktopDir & "\test.txt", 2 + 8)

If $file = -1 Then
    MsgBox(0, "エラー", "ファイルを開けません")
    Exit
EndIf

FileWriteLine($file, "行")
FileWrite($file, "t")

MsgBox(0, "すべてのデータ", FileRead($file))

FileClose($file)

どうでしょうか?FileRead でデータを読み取り、メッセージボックスを表示していますが、内容が空白ですね。

原因は既に上で説明していますので、わからない場合はもう一度「TXTファイルの読み取り、書き込みと内容の削除」から読み直してみてください。

TXTファイルの内容を削除

TXTファイルの内容を削除するには、ファイルを 2 = 書き出しモード(内容消去後、書き込み) で開くだけで削除できます。

; ファイルを書き出しモード(内容消去後、書き込み)で開きます。
$file = FileOpen(@DesktopDir & "\test.txt", 2)

If $file = -1 Then
    MsgBox(0, "エラー", "ファイルを開けません")
    Exit
EndIf

FileClose($file) ; 必ずファイルハンドルを閉じてください。

コメント