none
[VB.NET]StreamWriter.WriteLineでバイナリ'00'で埋め尽くすことがあるのか? RRS feed

  • 質問

  • [開発環境]

    Visual Studio 2008 SP1

    Windows7 SP1 (32bit)

    VB.NETで作成しています。

    (Frameworkは3.5)

    パブリック構造体の値を、DBではなくテキストファイルに上書き更新する仕組みを、

    以下のコードで実装しています。

      Public Function WriteUnitInfo() As Boolean
            Dim bRet As Boolean = False
            Dim FileName As String
            Dim TextStr As String = ""

            FileName = prMstPath & prCstFileNameUnitInfo

            Try
                TextStr = ""
                TextStr &= Format(CInt(puUnitInfo.UnitID), "000")
                TextStr &= Format(CLng(puUnitInfo.NouhinDenpyoNo), "000000000")
                TextStr &= Format(CLng(puUnitInfo.HenpinDenpyoNo), "000000000")
                TextStr &= Format(CInt(puUnitInfo.TenpoCD), "00")
                TextStr &= Format(CInt(puUnitInfo.TantoCD), "000")
                TextStr &= Format(CDbl(puUnitInfo.TaxRate) / 100, "0.00")

                Dim sw As New System.IO.StreamWriter(FileName, False, _
                    System.Text.Encoding.GetEncoding("shift_jis"))

                sw.WriteLine(TextStr)
                sw.Close()
                bRet = True
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally

            End Try

            Return bRet
        End Function

    構造体puUnitInfoの中身は、

        Public Structure stUnitInfo
            Dim UnitID As String
            Dim NouhinDenpyoNo As Long
            Dim HenpinDenpyoNo As Long
            Dim TenpoCD As String    
            Dim TantoCD As String     
            Dim TaxRate As Integer   
            Dim DenpyoDate As String
            Dim TokCD As String        
            Dim TokEda As String      
            Dim AreaCD As String      
            Dim TopRow As Integer   
        End Structure

    テキストファイルの中身は、

    001000000006000000002010060.08

    の30文字(必ず30文字になる)できちんとメモ帳でも開いて表示でき、

    バイナリエディタで見ると、

    30 30 31 30 30 30 ・・・30 38 0D 0A

    の32バイトになります。

    Releaseモードのx86でビルドしたexeを、東芝のタブレット(Windows 8.1 with Bing 32bit)で実行し、

    5ヶ月間ほど毎日実行して運用していたのですが、

    1回だけ、そのテキストファイルの中身が、

    テキストエディタで見ると何もない状態(カーソルは先頭)で、

    バイナリエディタで見ると、

    00 00 00 00 ・・・ 00 00 00

    の32バイトで埋め尽くされた状態になっていました。

    もちろんプログラム上からファイルの中身は読み込めません。

    中身が0バイトだったり、数字の0(バイナリでいう'30')で埋め尽くされるのならともかく、

    全てバイナリ'00'で綺麗に32バイト分置き換わることが理解できません。

    上記のロジックでこのような事がありえるのでしょうか?

    (まるでウィルスの挙動ですが、ウィルスチェックでは問題ありませんでした)

    タブレットは4台あり、全部同じ環境にして同じexeで毎日実行してきましたが、

    発生したのは今のところ1台の1回だけです。

    単純に、こういう事がありあえるのか?あるならその理由 だけを教えていただけますでしょうか?

    なお、このコードや環境にした理由や解決案についてはここでは求めておりませんのであしからず。

    以上、宜しくお願い致します。

    2015年12月25日 9:05

すべての返信

  • > 単純に、こういう事がありあえるのか?あるならその理由 だけを教えていただけますでしょうか?
    > なお、このコードや環境にした理由や解決案についてはここでは求めておりませんのであしからず。

    このフォーラムは「ユーザー同士が情報交換を行うための場」ということなので、そういう質問の仕方はいかがなものかと思いますが。

    フォーラムでご質問頂くにあたっての注意点
    https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?forum=announceja

    少なくとも私は歓迎できません。

    2015年12月25日 9:40
  • タブレットとの事ですから、書き込みはNANDフラッシュを使ったストレージに行っているのではないでしょうか?
    それであれば、ハードウェアの障害や、フラッシュの制御チップやファームウェアのバグ、衝撃やノイズなど外的要因の可能性があります。

    NANDフラッシュは仕組み上、データの上書きが出来ません。
    書き込む予定のブロック内のデータを一旦退避させ、そこを全てローレベルで埋めてから、元のデータと新たに書き込むデータを合わせて書き直す動作を行っています。
    その途中で何かしらの障害が発生したような気がします。
    • 回答の候補に設定 星 睦美 2016年1月7日 2:18
    2015年12月25日 10:24