DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字コードを指定してテキストファイルに書き込む

ここでは、テキストファイルに文字列を書き込む方法について説明します。

ストリームを使ってテキストファイルに書き込む

最も基本的な方法は、StreamWriterクラスWriteメソッドを使う方法です。

早速ですが、以下に簡単な例を示します。この例ではテキストボックス"TextBox1"の内容をShift JISコードでテキストファイル"C:\test\1.txt"に書き込んでいます。

VB.NET
コードを隠すコードを選択
'Shift JISで書き込む
'書き込むファイルが既に存在している場合は、上書きする
Dim sw As New System.IO.StreamWriter("C:\test\1.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
'TextBox1.Textの内容を書き込む
sw.Write(TextBox1.Text)
'閉じる
sw.Close()
C#
コードを隠すコードを選択
//Shift JISで書き込む
//書き込むファイルが既に存在している場合は、上書きする
System.IO.StreamWriter sw = new System.IO.StreamWriter(
    @"C:\test\1.txt",
    false,
    System.Text.Encoding.GetEncoding("shift_jis"));
//TextBox1.Textの内容を書き込む
sw.Write(TextBox1.Text);
//閉じる
sw.Close();

StreamWriterは使用後にCloseメソッドを使って閉じる必要があります。通常は、usingステートメントやtry...finallyを使って確実にCloseメソッドが呼び出されるようにします。詳しくは、「Dispose、Closeが確実に呼び出されるようにする」をご覧ください。

「Encoding.GetEncoding("shift_jis")」というのは、Shift-JISのエンコーディングを使用して文字列をファイルに書き込めという意味です。もしEUCで書き込みたいのであれば、"shift_jis"を"euc-jp"に変えます。JISであれば、"iso-2022-jp"にします。これについて詳しくは、「目的の文字コードに合ったEncodingオブジェクトを取得する」で説明します。

UTF-8で書き込む時は、Encodingの指定自体を省略できます。ただしこの場合、BOM無しUTF-8になります。EncodingにEncoding.UTF8プロパティを指定した時は、BOM有りUTF-8になります。詳しくは、「BOM無しUTF-8でテキストファイルに書き込む」で説明します。

補足:UTF-8で書き込みをするのであれば、File.CreateTextメソッドを使ってStreamWriterオブジェクトを作成することもできます。

Writeメソッドを呼び出してすぐにデータがファイルに書き込まれるとは限りません。Flushメソッドを呼び出すことにより、書き込みが行われます。CloseメソッドでもFlushが呼び出されます。Writeを呼び出した時に自動的にFlushが呼び出されるようにするには、AutoFlushプロパティをTrueにします。

補足:StreamWriterはFileShare.Readとしてファイルを開きます。よって、StreamWriterで開いているファイルは、別のプロセス(あるいは自分のプロセス)からの読み込みは可能でも、書き込みはできません。この設定を変更する方法は、「ファイルをロック(アクセスを制限)する」で紹介します。
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.OpenTextFileWriterメソッドを使ってStreamWriterオブジェクトを作成することもできます。また、UTF-8で書き込むのであれば、File.CreateTextメソッドを使うこともできます。

既存のファイルに追加で書き込む

先の例では、書き込もうとしているファイルが既に存在している場合、上書きします。ファイルが存在しているときにファイルの末尾に追加して書き込むには、StreamWriterコンストラクタの2番目のパラメータをTrueにします。

VB.NET
コードを隠すコードを選択
'Shift JISで書き込む
'書き込むファイルが既に存在している場合は、ファイルの末尾に追加する
Dim sw As New System.IO.StreamWriter("C:\test\1.txt", _
    True, _
    System.Text.Encoding.GetEncoding("shift_jis"))
'TextBox1.Textの内容を書き込む
sw.Write(TextBox1.Text)
'閉じる
sw.Close()
C#
コードを隠すコードを選択
//Shift JISで書き込む
//書き込むファイルが既に存在している場合は、ファイルの末尾に追加する
System.IO.StreamWriter sw = new System.IO.StreamWriter(
    @"C:\test\1.txt",
    true,
    System.Text.Encoding.GetEncoding("shift_jis"));
//TextBox1.Textの内容を書き込む
sw.Write(TextBox1.Text);
//閉じる
sw.Close();
補足:UTF-8で追加の書き込みをするのであれば、File.AppendTextメソッドを使ってStreamWriterオブジェクトを作成することもできます。

一行ずつ書き込む

一行書き込むには、WriteLineメソッドを使うと便利です。WriteLineで書き込むと、自動的に末尾に改行文字列が挿入されます。改行文字列は、NewLineプロパティで指定されている文字列(デフォルトで、「キャリッジリターン+ラインフィード」)になります。

VB.NET
コードを隠すコードを選択
'ファイルを上書きし、Shift JISで書き込む 
Dim sw As New System.IO.StreamWriter("C:\test\1.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
'TextBox1.Textの内容を1行ずつ書き込む 
For Each line As String In TextBox1.Lines
    sw.WriteLine(line)
Next
'閉じる 
sw.Close()
C#
コードを隠すコードを選択
//ファイルを上書きし、Shift JISで書き込む
System.IO.StreamWriter sw = new System.IO.StreamWriter(
    @"C:\test\1.txt",
    false,
    System.Text.Encoding.GetEncoding("shift_jis"));
//TextBox1.Textの内容を1行ずつ書き込む
foreach (string line in TextBox1.Lines)
{
    sw.WriteLine(line);
}
//閉じる
sw.Close();

Writeメソッドを使って自分で改行文字列を挿入して書き込んでも同じようなことができます。

VB.NET
コードを隠すコードを選択
'ファイルを上書きし、Shift JISで書き込む 
Dim sw As New System.IO.StreamWriter("C:\test\1.txt", _
    False, _
    System.Text.Encoding.GetEncoding("shift_jis"))
'TextBox1.Textの内容を1行ずつ書き込む 
For Each line As String In TextBox1.Lines
    sw.Write(line + sw.NewLine)
Next
'閉じる 
sw.Close()
C#
コードを隠すコードを選択
//ファイルを上書きし、Shift JISで書き込む
System.IO.StreamWriter sw = new System.IO.StreamWriter(
    @"C:\test\1.txt",
    false,
    System.Text.Encoding.GetEncoding("shift_jis"));
//TextBox1.Textの内容を1行ずつ書き込む
foreach (string line in TextBox1.Lines)
{
    sw.Write(line + sw.NewLine);
}
//閉じる
sw.Close();

.NET Framework 2.0以降で、ストリームを使わずに簡単に書き込む

.NET Framework 2.0からは、File.WriteAllTextメソッドを使って文字列をテキストファイルに書きこむことができます。WriteAllTextメソッドは、文字列を書き込んで、ファイルを閉じます。ファイルが既に存在していた場合は、上書きします。例外が発生しても確実にファイルを閉じてくれます。

File.WriteAllLinesメソッドを使うと、String型の配列を書き込むことができます。配列の要素の末尾には改行文字列が付加されます。

すでにファイルが存在しているときに追加で書き込むには、File.AppendAllTextメソッドを使います。

これらのメソッドを使ってテキストファイルに文字列を書き込む例を以下に示します。

VB.NET
コードを隠すコードを選択
'書き込み先のテキストファイル 
Dim filePath As String = "C:\test\1.txt"
'文字コード(ここでは、Shift JIS) 
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")

'TextBox1の内容を書き込む 
'ファイルが存在しているときは、上書きする 
System.IO.File.WriteAllText(filePath, TextBox1.Text, enc)

System.IO.File.WriteAllLines(filePath, TextBox1.Lines, enc)

'ファイルの末尾にTextBox1の内容を書き加える 
System.IO.File.AppendAllText(filePath, TextBox1.Text, enc)
C#
コードを隠すコードを選択
//書き込み先のテキストファイル
string filePath = @"C:\test\1.txt";
//文字コード(ここでは、Shift JIS)
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis");

//TextBox1の内容を書き込む
//ファイルが存在しているときは、上書きする
System.IO.File.WriteAllText(filePath, TextBox1.Text, enc);

System.IO.File.WriteAllLines(filePath, TextBox1.Lines, enc);

//ファイルの末尾にTextBox1の内容を書き加える
System.IO.File.AppendAllText(filePath, TextBox1.Text, enc);
補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystem.WriteAllTextメソッドで同様のことができます。
  • 履歴:
  • 2006/11/20 「一行ずつ書き込む」の追加など。
  • 2007/1/25 AppendAllTextメソッドに関する記述を追加。
  • 2010/1/23 説明やコードの一部をより分かりやすいように書き換える。
  • 2013/9/30 誤字修正など。
  • 2014/5/7 BOMが付加するかについての説明を追加。
  • 2014/12/17 「一行ずつ書き込む」のVB.NETのコードで、Closeメソッドが連続していたのを修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。