ns05
@ns05

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

空白テキストファイルのBOM削除

解決したいこと

VBSでテキストファイルを保存するときに、UTF-8のBOMがついてしまうのを防ぐために、以下のようなコードを作りました。

Const adModeReadWrite = 3
Const adTypeBinary = 1
Const adTypeText = 2
Const adReadAll = -1
Const adReadLine = -2
Const adWriteChar = 0
Const adWriteLine = 1
Const adSaveCreateOverWrite = 2
Const adCRLF = -1

Sub RemoveBOM(FilePath)
    Dim ObjAdoStream, WriteString
    Set ObjAdoStream = CreateObject("ADODB.Stream")

    With ObjAdoStream
        .Type = adTypeText
        .Mode = adModeReadWrite
        .Charset = "UTF-8"
        .Open
        .LoadFromFile(FilePath)
        .ReadText(adReadLine)
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        WriteString = .Read()
        .Position = 0
        .Write WriteString
        .SetEoS
        .SaveToFile FilePath, adSaveCreateOverWrite
        .Close
    End With
End Sub

通常時はこれで上手く行くのですが、空白ファイルを対象にすると以下のようなエラーが出ます。

無題.png

恐らくWriteStringがNULLとなっているためだと思われます。

空白ファイルを対象にした時もBOMを取り除いて保存する方法はありますか?

0

2Answer

下記サイトの「BOMなしのUTF-8でファイルに書き込む」が参考になると思います。

(3バイトずらして一旦クローズするところがミソなのかも)

0Like

Comments

  1. @ns05

    Questioner

    @nak435

    ご返信ありがとうございます。
    上記のサイトを参考にしたところ、通常時は動作しますが、やはり空白ファイルを対象にするとエラーが起きてしまうようです。

  2. そうなると、同サイトの「一時ファイルを使う方法」しかないのかも知れません。

  3. @albireo さんのご指摘のように if文 を追加すると、0 バイトのファイルになりました。

空白ファイルとは

  • BOMだけでテキストがないファイル
  • BOMもなくサイズが0のファイル

のどちらでしょうか?
このプログラムはBOMがないファイルでも問答無用で先頭3バイト削ってしまうようなので、後者だとエラーになるのは当然というか
これを「空白ファイルの時だけ正しく動作しない」と認識してしまうことの方がまずいと思います。
BOMなしテキストファイルを破壊してしまう問題として対処が必要。

0Like

Comments

  1. @ns05

    Questioner

    @albireo

    ご返信ありがとうございます。
    空白ファイルとは、「BOMだけでテキストがないファイル」のことです。
    プロパティ上では、サイズは3バイトとなっています。

  2. となると、@ns05 さんの言われる通り「サイズ0の文字列を書き込む」がNGっぽいですね。

        .Position = 0
        If Len(WriteString) > 0 Then
            .Write WriteString
        End If
        .SetEoS
    

    みたいにすればどうでしょう?

  3. @ns05

    Questioner

    ご指摘のプログラムに変更したところ、上手く動きました。
    ありがとうございます。

Your answer might help someone💌