C# で文字列を記入してファイルを出力する方法を紹介します。

ファイルにデータを保存するにはどうしたらいい!?
アプリケーションを開発していると、「ファイルにデータを保存したい」て事が多々あります。ファイルに保存すれば、パソコンのディスク上にデータが保存されるので、アプリを閉じても消える事がなく、コピーや再編集が可能になります。
ファイルの読み取りをしたい方は、次の記事でファイルの読み込み方法を紹介してますので参考にしてみてください。

この記事ではファイルに書き込む方法を2種類(Write・WriteLine)紹介していますので、ぜひ最後まで読んでみてください。

オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
ファイルへ書き込むには?

C# でファイルに書き込みをする場合は、「StreamWrite クラス」を使うのが一般的です。ファイルの書き込み専用のクラスで、ファイルにテキストを書き込む Writeメソッド や WriteLineメソッド が用意されています。
メソッド名 | 説明 |
Write | ストリームに文字列、文字配列、文字などを書き込みます。 |
WriteAsync | 非同期でストリームに文字列、文字配列、文字などを書き込みます。 |
WriteLine | ストリームに1行だけ文字列と改行を書き込みます。 |
WriteLineAsync | 非同期でストリームに1行だけ文字列と改行を書き込みます。 |
StreamWriter はファイル名を指定しますが、ファイル名の拡張子は自由に設定が可能です。テキストファイル(.txt)やCSVファイル(.csv)、ログファイル(.log)などにテキストを書き込めるという特徴があります。
指定したファイル名がない場合はファイルが新規作成されます。指定したファイル名がある場合は、既存ファイルに上書きして保存したり、既存ファイルの最後の行に追記するといった操作も可能です。
ファイルの書き込む方法

ここからはファイルにテキストを書き込む方法を紹介します。
まずは StreamWriter を利用できるように、csファイルのヘッダー部分に名前空間「System.IO」を設定しましょう。
using System.IO;
ファイルにテキストを書き込むには、3つの処理を順番に行うのが基本です。

StreamWriter クラスのコンストラクタの引数にファイルパス、上書き保存する又はファイルの末尾に追加する、エンコードの指定を行います。
StreamWriter(ファイルパス, 上書き保存 or 末尾に追加, エンコード)
第1引数は string 型で、ファイル名もしくはファイルの絶対パスを指定します。
第2引数は bool 型で、「true」または「false」を指定します。「true」の場合は、既存ファイルのテキストを残したまま、末尾にテキストを追加します。「false」の場合は、既存ファイルのテキストは全て削除され、新しくテキストが上書きされます。
第3引数は必ずしも必要ではありません。文字のエンコードを指定しない場合は、デフォルト値(UTF-8)を使用してファイルへテキストを書き込みます。
エンコードにはいくつかの種類があり、C# でエンコードを指定する例を挙げておきます。
エンコードの種類 | エンコードの指定 |
日本語 Shift-JIS | Encoding.GetEncoding(“shift_jis”) |
日本語 EUC | Encoding.GetEncoding(“euc-jp”) |
日本語 JIS | Encoding.GetEncoding(“iso-2022-jp”) |
Unicode | Encoding.Unicode |
UTF8 | Encoding.UTF-8 |
UTF-32 | Encoding.UTF32 |
Write メソッド
StreamWriter クラスの Write メソッドで、既存ファイルに新しくテキストを上書きする方法です。既存ファイルがない場合はファイルを新規作成します。
private void WriteFile()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//書き込むテキスト
var days = new string[] { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日" };
try
{
//ファイルをオープンする
using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("Shift_JIS")))
{
foreach (var day in days)
{
//テキストを書き込む
sw.Write(day);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
上記のソースコードを実行すると次の結果になります。Write メソッドは改行せずにテキストを続けて記述することができます。

StreamWriter クラスのコンストラクタの第2引数が false なので、何度実行しても上書き保存されて上図の結果になります。
この第2引数を true にすると、ファイルの末尾にテキストが追加されます。
using (StreamWriter sw = new StreamWriter(fileName, true, Encoding.GetEncoding("Shift_JIS")))

StreamWriter クラスを使用した後は Close メソッドでストリームを閉じます。この時、Close メソッドを呼び出すことを忘れてしまうとリソースが解放されません。
using を使っておけば、Closeメソッドを実装しなくても自動で解放処理を行うので 、Close メソッドの記述漏れを防ぐことができます。
WriteAsync メソッド
非同期でファイルにテキストを書き込む方法です。
ファイルに大量の文字を書く場合に発生するデッドロックを防止することができます。
private async Task WriteFileAsync()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//書き込むテキスト
var days = new string[] { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日" };
try
{
//ファイルをオープンする
using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("Shift_JIS")))
{
foreach (var day in days)
{
//テキストを書き込む
await sw.WriteAsync(day);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Write メソッドを WriteAsync メソッドに変更し、非同期のお約束事である「async / await」を付けます。
上記のソースコードを実行すると次の結果になります。Write メソッドと同じで改行せずにテキストを続けて記述します。

WriteLine メソッド
StreamWriter クラスの WriteLine メソッドで、既存ファイルに新しくテキストを上書きする方法です。既存ファイルがない場合はファイルを新規作成します。
private void WriteLineFile()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//書き込むテキスト
var days = new string[] { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日" };
try
{
//ファイルをオープンする
using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("Shift_JIS")))
{
foreach (var day in days)
{
//テキストを書き込む
sw.WriteLine(day);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
上記のソースコードを実行すると次の結果になります。WriteLine メソッドは改行してテキストを続けて記述することができます。

StreamWriter クラスのコンストラクタの第2引数が false なので、何度実行しても上書き保存されて上図の結果になります。
この第2引数を true にすると、ファイルの末尾にテキストが追加されます。Write メソッドとここは同じです。
using (StreamWriter sw = new StreamWriter(fileName, true, Encoding.GetEncoding("Shift_JIS")))

WriteLineAsyncメソッド
非同期でファイルにテキストを書き込む方法です。
ファイルに大量の文字を書く場合に発生するデッドロックを防止することができます。
private async Task WriteLineFileAsync()
{
//ファイル名
var fileName = "sample.txt";
//var fileName = @"C:\sample.txt"; 絶対パスでも良い
//書き込むテキスト
var days = new string[] { "月曜日", "火曜日", "水曜日", "木曜日", "金曜日" };
try
{
//ファイルをオープンする
using (StreamWriter sw = new StreamWriter(fileName, true, Encoding.GetEncoding("Shift_JIS")))
{
foreach (var day in days)
{
//テキストを書き込む
await sw.WriteLineAsync(day);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
WriteLine メソッドを WriteLineAsync メソッドに変更し、非同期のお約束事である「async / await」を付けます。
上記のソースコードを実行すると次の結果になります。WriteLine メソッドと同じで改行してテキストを続けて記述します。

まとめ

この記事ではファイルに文字列を書き込む方法を紹介しました。
System.IO の StreamWriter クラスを利用することで、ファイルに書き込むことができます。書き込むための2種類のメソッドが用意されていますので、使用用途に応じて使い分けをしましょう。
- Writeメソッド:改行無しでファイルに書き込む場合に使用する
- WriteLineメソッド:改行有りでファイルに書き込む場合に使用する
以上、最後まで読んで頂きありがとうございました。


