ファイルにテキストを書き込むには?[C#/VB、.NET全バージョン].NET TIPS

StreamWriteクラスを用いたファイルへのテキストの書き込み、using構文によるファイルのクローズなど、.NETにおけるテキストファイル書き込みの基礎を説明する。

» 2018年07月18日 05時00分 公開
「.NET TIPS」のインデックス

連載「.NET TIPS」

本稿は2007/11/08に初版公開された記事を改訂し、Visual Studio 2017でコードの動作検証、usingステートメントを使うサンプルコードの追加、図版の追加、全般的な構成の変更などを行ったものです。
また、最近のWindowsではCドライブのルートフォルダに通常の権限ではファイルを作れないため、実行ファイルと同じフォルダにファイルを作成するように既存のコードも修正しました。


 「TIPS:テキストファイルの内容を読み込むには?」では、テキストファイルに記述されたテキスト内容を読み込む方法を紹介している。本TIPSではこれとは逆の処理、つまりテキストファイルにテキスト内容を書き込む方法を紹介する。

POINT ファイルにテキストを書き込む方法

ファイルにテキストを書き込む方法まとめ ファイルにテキストを書き込む方法まとめ
ここではVisual Studio 2008から利用可能になった、型推論による暗黙の型指定を使っている(本文には、全バージョンで利用できる明示的な型指定で記載)


 特定のトピックをすぐに知りたいという方は以下のリンクを活用してほしい。

関連TIPS

 テキストファイルに書き込むには、その目的や利用している.NET Frameworkのバージョンによって、さまざまな方法がある。適切な方法を選んでほしい。


ファイルにテキストを書き込む最も基本的な方法

 テキストファイルに内容を書き込む手順は、基本的に次の3ステップになる。

  1. テキストファイルを開く、もしくは作成する
  2. テキスト内容を書き込む
  3. テキストファイルを閉じる

 「1. テキストファイルを開く、もしくは作成する」の最も基本的な方法は、StreamWriterクラス(System.IO名前空間)のコンストラクタを使うことだ(読み込みに利用するStreamReaderクラスとは違うことに注意)。

 コンストラクタの第1パラメーターにはファイルのパス名を指定し、第2パラメーターにはtrueかfalseを指定する。trueの場合、既存のテキスト内容が全て残されたまま、その末尾にテキスト内容が追記される。falseの場合、いったん既存の内容が完全に削除されてから、新たにテキスト内容が書き込まれる。第3パラメーターにはテキストファイルの文字エンコードとしてEncodingクラス(System.Text名前空間)のオブジェクトを指定する(Encodingオブジェクトの取得方法については「TIPS:Encodingクラスで扱えるエンコーディング名は?」を参考にされたい)。なお、テキストファイルが存在しない場合は、自動的にファイルを作成してくれる。

 次のコードは、実際にStreamWriterクラスのコンストラクタを呼び出すコード例である。コード中の「sjisEnc」はEncodingオブジェクトを表す。

StreamWriter writer = 
  new StreamWriter("Test.txt", true, sjisEnc);

Dim writer As StreamWriter = New StreamWriter("Test.txt", True, sjisEnc)

StreamWriterクラスのコンストラクタの呼び出し例(上:C#、下:VB)

 VB8以降では、このStreamWriterクラスのコンストラクタ以外にも(My機能)「My.Computer.FileSystem.OpenTextFileWriterメソッド」も利用できる。このメソッドのパラメーターは、StreamWriterクラスのコンストラクタと全く同じで、具体的には次のようなコードになる。

Dim writer As StreamWriter = My.Computer.FileSystem.OpenTextFileWriter("Test.txt", True, sjisEnc)

My機能を使用した場合のVBのコード例

 「2. テキスト内容を書き込む」を行うには、StreamWriterオブジェクトのWriteLineメソッドもしくはWriteメソッドを呼び出せばよい。どちらもパラメーターに指定された文字列をファイルに書き出す機能を持つ。違いは、WriteLineメソッドは出力した文字列の最後に改行(=行終端記号。既定では「\r\n」)を挿入することだ。

 最後に「3. テキストファイルを閉じる」ではStreamWriterオブジェクトのCloseメソッドを呼び出す。Closeメソッドの代わりに、C#のusingステートメント(参考:「TIPS:確実な終了処理を行うには?」)や、VBのUsingステートメント(参考「Visual Basic 2005 ここが便利!:第5回 Usingステートメントで簡単、確実にファイルをクローズ」)を使ってもよい。

 次のコードは、ここまでの説明に従って記述したサンプルプログラムである。

using System.Text;
using System.IO;

class Program
{
  static void Main(string[] args)
  {
    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    StreamWriter writer =
      new StreamWriter("Test.txt", true, sjisEnc);
    writer.WriteLine("テスト書き込みです。");
    writer.Close();
  }
}

Imports System.Text
Imports System.IO

Module Module1

  Sub Main()
    Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
    Dim writer As StreamWriter = New StreamWriter("Test.txt", True, sjisEnc)
    writer.WriteLine("テスト書き込みです。")
    writer.Close()
  End Sub

End Module

テキストファイルに内容を書き込むサンプルプログラム(上:C#、下:VB)

 このサンプルプログラムを実行すると、プログラムと同じフォルダに作られる「Test.txt」ファイルの末尾に「テスト書き込みです。」というテキスト内容がシフトJISエンコードで追加される。StreamWriterクラスの第2パラメーターにtrueを指定しているので、2回目以降の実行では既存の「Test.txt」ファイルの末尾にテキスト内容がどんどん追記されていくことを確認できる。

usingステートメントによるファイルのクローズ

 StreamWriterクラスはIDisposableインタフェースを実装しているため(正確には親クラスのTextWriterクラスが実装している)、次のサンプルプログラムのように、Closeメソッドを呼び出す代わりにusingステートメントを利用することもできる(IDisposableインタフェースやusingステートメントに関しては「TIPS:確実な終了処理を行うには?」で解説している)。

using System;
using System.IO;
using System.Text;

class Program
{
  static void Main(string[] args)
  {
    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    // (1)テキストファイルを開いて(なければ作って)StreamWriterオブジェクトを得る
    using (StreamWriter writer = new StreamWriter("Test.txt", false, sjisEnc))
    {
      // (2)ファイルにテキストを書き込む
      writer.WriteLine(DateTime.Now.ToString("書き込み時刻:HH:mm:ss"));

    } // (3)usingブロックを抜けるときにファイルが閉じられる
  }
}

Imports System.IO
Imports System.Text

Module Module1
  Sub Main()
    Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
    ' (1)テキストファイルを開いて(なければ作って)StreamWriterオブジェクトを得る
    Using writer As StreamWriter = New StreamWriter("Test.txt", False, sjisEnc)
      ' (2)ファイルにテキストを書き込む
      writer.WriteLine(DateTime.Now.ToString("書き込み時刻:HH:mm:ss"))

    End Using ' (3)Usingブロックを抜けるときにファイルが閉じられる
  End Sub
End Module

usingステートメントを使用しているサンプルプログラム(上:C#、下:VB)

 この場合には、usingステートメントの実行を終えたときに、自動的にStreamWriterクラスのDisposeメソッドが呼び出され、その中でCloseメソッドが呼び出されることになる。

 また、StreamWriterクラスのコンストラクタの第2パラメーターにfalseを指定したので、既存の内容が完全に削除されてから新たにテキスト内容が書き込まれる(上書き)。書き込む内容にそのときの時刻も含めてあるので、実行するたびに上書きされることを確認できる。

カテゴリ:クラスライブラリ 処理対象:テキストファイル
使用ライブラリ:StreamWriterクラス(System.IO名前空間)
使用ライブラリ:Encodingクラス(System.Text名前空間)
関連TIPS:テキストファイルの内容を読み込むには?
関連TIPS:Encodingクラスで扱えるエンコーディング名は?
関連TIPS:確実な終了処理を行うには?
関連TIPS:テキスト・ファイルの内容を簡単に書き込むには?[2.0のみ、C#、VB]
関連TIPS:テキストファイルの内容を非同期的に書き込むには?[C#/VB、.NET 4.5]


更新履歴

【2018/07/18】Visual Studio 2017でコードの動作検証と修正、usingステートメントを使うサンプルコードの追加、図版の追加、全般的な構成の変更などを行いました。

【2007/11/08】初版公開。


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。