質問: 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")) ``` 上記3つの方法で出力しました。 個別出力グリッドの1行1ファイルでは、全行の出力が確認できておりますが、 1つのファイルに全行出力の場合は、2行抜けてしまうケースがありました。 グリッドの情報は全部で830行となります。 個々の出力においては、830個のファイルが出力されており、データも存在しているが 1ファイル全行出力のファイルにおいては、828行しか存在してませんでした。
回答: まず.NETはソースコードが公開されています。 * `FileSystem.WriteAllText` * `File.AppendAllText` 両メソッドを試されていますが、どちらも内部で`StreamWriter`を呼び出しているに過ぎません。もちろん * `StreamWriter` も公開されています。リンクは.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`等を疑っている方には有益と判断し、この回答を投稿します。