DOBON.NET DOBON.NETプログラミング掲示板過去ログ

StreamWriterでファイルに出力

環境/言語:[WinXPSP2 .NET Framework1.1 VB.NET]
分類:[.NET]

よろしくお願いします。

現在コンソールアプリケーション作成していて、配列内の文字列をファイルへ出力したいと思っています。
途中まではファイルへ出力されるのですが、毎回同じ場所でファイルに書き込まれなくなります。
エラー等はでていません。
StreamWriterを使わず、FileOpenとPrintとFileCloseを使用してファイルへ出力した場合は、配列内の文字列は全て出力されています。
以下に再現するコードを書きます。
どうして途中でファイルに書き込まれなくなるのかを教えて下さい。
よろしくお願いします。
(他の方が試して再現しなかったらどうしよ…。)

Sub Main()
Dim test(357) As String
Dim OutFile As System.IO.StreamWriter
Dim i As Integer
OutFile = New System.IO.StreamWriter("C:\test.txt")

For i = 0 To 357
test(i) = "123456789abcdef"
OutFile.WriteLine(test(i))
Next
End Sub
■No13747に返信(ユウさんの記事)
> どうして途中でファイルに書き込まれなくなるのかを教えて下さい。

Close していないからです。
Close は Try 〜 Finally を使用して確実にされるように実装してください。
http://jeanne.wankuma.com/tips/programing/01-dispose.html

また、提示されたコードですと、行数の確認がしにくいので以下のようなコードで確認しました。
参考になれば幸いです。

Private Shared Sub OneMethod()
    Dim testStrings As String() = New String(357) {}

    Dim hWriter As System.IO.StreamWriter

    Try
        hWriter = New System.IO.StreamWriter("C:\Test.txt")

        For i As Integer = 0 To testStrings.Length - 1
            testStrings(i) = "[" & i.ToString() & "]"
            hWriter.WriteLine(testStrings(i))
        Next i
    Finally
        If Not hWriter Is Nothing Then
            hWriter.Close()
        End If
    End Try
End Sub
> Close していないからです。

補足。

XXXWriter.Close() ではマズイ場合もあります。

Stream を内包している XXXWriter の Close() は、基になる Stream も Clsoe() してしまいます。

なので、最初に Stream を作成して、その Stream を基にいくつかの XXXWriter() を作って一連の書き込み(=自前のシリアライズのような処理)を行うような場合、XXXWriter.Close() ではなく XXXWriter.Flush() して、次の XXXWriter() に処理を引き継ぐようにします。

あまりやらないかもしれませんが、一応念のため。
じゃんぬさん、渋木さん、ありがとうございます。

おかげさまで全てファイルに出力することができました。
また、補足の内容も覚えておきます。

色々とありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板