

My.Computer.FileSystem.WriteAllTextの関数を使用して、Stringの内容をファイル出力しております。

グリッドの情報をカンマ区切りで出力するような感じで出力をしているのですが、途中データが抜けてしまう事が発生してしまいます。

再現性は100%ではなく、端末にも依存している可能性があります。

[code]

    Dim fileName as String = "C:\work\output.csv"
    
    for i as integer = 0 to grid.RowCount -1
    
    　Dim strData as String = GetData()
    
    　My.Computer.FileSystem.WriteAllText(fileName , strData , True, Encoding.GetEncoding("shift_jis"))
    
    Next
    
[/code]

出力したいデータ数が600だった場合、実際に出力されるデータ数が598や599となることがあります。

抜けてしまう、データについては、毎回同じではなく規則性はないように見受けられます。

GetData()と別の関数にてデータ取得したものを書き出ししているのですが、strData.lengthをログ出力した際には、0とはならなかったことから、データは取得出来ていると認識しております。

StreamWriterで代用をしましたが、同様の現象が発生しました。

StreamWriterの場合は、For文内で、Open/Closeを行って試しました。

何が原因で、対策としては何が良いのか、わからないため、質問させていただきました。

2021/09/27 テスト用のコードを作成しました。

[code]

    '既存の出力したいファイル(一つのファイルに順次追記をしていきます)
    Dim writer As System.IO.StreamWriter = New System.IO.StreamWriter(vFile, True, Encoding.GetEncoding("shift_jis"))
    writer.WriteLine(strLine)
    writer.Close()
    
    'デバッグ用のコード
    'ファイル名にグリッドの情報を使用して生成してStringの情報をファイル書き込み
    Dim wFileName As String = i + 1 & "_" & .Item(0, i).Value & "_" & .Item(1, i).Value & ".csv"
    
    'StreamWriter
    Dim testWrite As System.IO.StreamWriter = New System.IO.StreamWriter(wRoot & wStrWriterPath & "\" & wFileName, True, Encoding.GetEncoding("shift_jis"))
    testWrite.WriteLine(strLine)
    testWrite.Close()
    
    'FileSystem WriteAllText
    My.Computer.FileSystem.WriteAllText(wRoot & wFileAllTextPath & "\" & wFileName, strLine, True, Encoding.GetEncoding("shift_jis"))
    
    'File WriteAllText
    System.IO.File.AppendAllText(wRoot & wFileAppendPath & "\" & wFileName, strLine, Encoding.GetEncoding("shift_jis"))
    
[/code]

上記3つの方法で出力しました。  
個別出力グリッドの1行1ファイルでは、全行の出力が確認できておりますが、  
1つのファイルに全行出力の場合は、2行抜けてしまうケースがありました。  
グリッドの情報は全部で830行となります。

個々の出力においては、830個のファイルが出力されており、データも存在しているが  
1ファイル全行出力のファイルにおいては、828行しか存在してませんでした。


CC BY-SA 4.0
2021-09-22T03:20:03.407
82628
2021-10-02T04:02:16.280
2021-09-27T08:39:15.867
48316
48316
question
.net
Visual Basic 2008 開発言語は.net におけるWriteAllTextで書き込みできない場合がある


まず.NETはソースコードが公開されています。

  * [`FileSystem.WriteAllText`](https://github.com/dotnet/runtime/blob/v5.0.10/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/FileIO/FileSystem.vb#L776-L819)
  * [`File.AppendAllText`](https://github.com/dotnet/runtime/blob/v5.0.10/src/libraries/System.IO.FileSystem/src/System/IO/File.cs#L554-L567)

両メソッドを試されていますが、どちらも内部で`StreamWriter`を呼び出しているに過ぎません。もちろん

  * [`StreamWriter`](https://github.com/dotnet/runtime/blob/v5.0.10/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs)

も公開されています。リンクは.NET 5.0のものであり、質問はVisual Basic 2008（.NET Framework
2.0～3.5辺り）でバージョンは異なりますが、基本的な実装は同じです。  
（以前は.NET Framework 2.0以降のソースコードも公開されていましたが、配布が終了してしまいました…。）

* * *

で、この`StreamWriter`はファイルI/Oの基礎であり、とてもバグがあるとは思えないというのが正直な感想です。例えばAzuleanさんが頻繁なOpen/Closeを避けるべきという提案をされています。もちろん頻繁なOpen/Closeを避けるべきというのは正しいですが、その一方で、たとえ頻繁であれ何らか問題が発生したのであれば`StreamWriter`は例外を投げる設計になっています。現状、例外が投げられていないのであれば、そのような問題は発生しておらず、指示通りの動作をしているはずです。  
（その意味では`On Error Resume Next`で例外を無視していませんよね？）

それよりはこの手の質問でありがちなのは、質問の範囲外に原因があるケースです。最初にコメントしましたがループ回数が想定と異なっているとか、それ以外にも、出力されたファイルの行数の数え方に違いがあるとか、エンコーディングが不正になっているとか、ウイルス対策ソフトがファイルの内容を書き換えてしまったとか。これらは思いついた例の一部であり、個々に否定されても意味はありません。可能性は無限にあり、それらは質問者さんにしかわからない内容です。

そんなわけで`StreamWriter`その他の動作を疑うよりは、その外側に目を向けることをお勧めしたいです。質問者さんとしては納得しかねるかもしれませんが、当サイトはQ&Aの蓄積が目的であり、その趣旨からすると質問者さんと同様に`StreamWriter`等を疑っている方には有益と判断し、この回答を投稿します。


CC BY-SA 4.0
2021-10-02T04:02:16.280
82818
2021-10-02T04:02:16.280
4236
82628
answer