テキストファイルの読込・書込を行う方法のまとめです。
読み書きどちらもSystem.IO.Fileクラスにあるメソッドを使い行うことができます。
テキストファイルの読込
読み込んだ内容を文字列型(string)で一気に受け取る方法と
改行ごとに区切った文字列型の配列で受け取る方法があります。
すべての内容を文字列型(string)として読み込む
System.IO.FileクラスのReadAllTextメソッドを使います。
引数にファイルのパスを渡すと、テキストファイルのすべての内容がstring型で返ってきます。
読み込むテキストファイルの内容はこんな感じです。
ファイル読込
テスト
用の
ファイルです。
ではコードです。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var txt = File.ReadAllText(filePath);
Console.WriteLine(txt);
}
}
出力結果はこんな感じです。改行も含めすべての内容を読み込んでいます。
ファイル読込
テスト
用の
ファイルです。
すべての行を読み込んで改行ごとの文字列型配列で受け取る
System.IO.FileクラスのReadAllLinesメソッドを使うとテキストファイルの内容を行ごとに配列に入れて返してくれます。string型の配列です。
using System;
using System.IO;
class Program
{
public static void Main()
{
string filePath = @"D:\test_utf8.txt";
string[] txtArray = File.ReadAllLines(filePath);
Console.WriteLine($"配列の要素数={txtArray.Length}");
foreach (var line in txtArray) {
Console.WriteLine(line);
}
}
}
テキストファイルの書き込み(新規作成)
テキストファイルの書き込みのサンプルです。
文字列型(string)の内容を一気に書き込む方法と
文字列型の配列を指定して要素ごとに改行を入れて書き込む方法があります。
ファイルを新規作成して書き込む
System.IO.FileクラスのWriteAllTextメソッドを使うと、ファイルを新規作成してテキストを書きだします。
第1引数にファイルパス、第2引数に書き込むテキスト(string型)を指定します。
また、同じ名前のファイルがすであった場合は、内容が上書きされます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeText = "書き込みテスト\nすでに同じ名前のファイルが\nあったら上書きされます。";
File.WriteAllText(filePath, writeText);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
書き込むテキストで改行するには \n が必要です。
文字列の配列を指定してファイルに書き込む
System.IO.FileクラスのWriteAllLinesメソッドを使うと、ファイルを新規作成して配列の内容を書きだします。配列の要素ごとに改行されます。
第1引数にファイルパス、
第2引数に書き込む文字列型の配列を指定します。
こちらも、同じ名前のファイルがすであった場合は内容が上書きされます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new string[] {
"書き込みテスト",
"すでに同じ名前のファイルが",
"あったら上書きされます。",
};
File.WriteAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。要素ごとに改行されて出力されます。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
正確には第2引数に指定できるは、IEnumerable型のデータなので、Listなどのコレクションも渡すことが出来ます。
using System;
using System.IO;
using System.Collections.Generic;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new List<string> {
"書き込みテスト",
"すでに同じ名前のファイルが",
"あったら上書きされます。",
};
File.WriteAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
テキストファイルの書き込み(追加)
すでに存在するテキストファイルの末尾に追加する方法です。
追加でテキストを書き込む
System.IO.FileクラスのAppendAllTextメソッドを使うと、すでにあるテキストファイルの末尾にテキストを追加することができます。
引数1にファイルパス、引数2に追加で書き込むテキスト(string型)を指定します。
指定ファイパスにファイルがなかった場合は、新規作成されます。
上のサンプルコードで作成したファイルに追加してみます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeText = "追加の書き込みテスト\n同じ名前のファイルがなかったら\n新規作成されます。";
File.AppendAllText(filePath, writeText);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
出力結果はこんな感じです。
書き込みテスト
すでに同じ名前のファイルが
あったら上書きされます。
追加の書き込みテスト
同じ名前のファイルがなかったら
新規作成されます。
文字列の配列やコレクションを指定して追加する
System.IO.FileクラスのAppendAllLinesメソッドを使うと、すでにあるテキストファイルの末尾に文字列型の配列の内容を追加することができます。
第1引数にファイルパス、
第2引数に追加する文字列型の配列または文字列型のコレクションを指定します。
各要素ごとに改行されて追加されます。
こちらも、指定ファイパスにファイルがなかった場合は、新規作成されます。
using System;
using System.IO;
class Program
{
public static void Main()
{
var filePath = @"D:\test_utf8.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
File.AppendAllLines(filePath, writeTextArray);
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath));
}
}
文字コードについて
C#でテキストファイルを読み書きするときに使われるデフォルトの文字コードはUTF-8になっています。
シフトJISなど違う文字コードのテキストファイルを扱いたいときは、読み書き時に文字コードを指定する必要があります。
.Net Frameworkの場合
シフトJISで読み込むサンプルになります。
文字コードを指定するには名前空間System.Textが必要です。
上で紹介しているメソッドの引数の最後に、
Encoding.GetEncoding(“shift_jis”) を指定します。
using System;
using System.IO;
using System.Text;
class Program
{
public static void Main()
{
var filePath = @"D:\test_shiftjis.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
File.AppendAllLines(filePath, writeTextArray, Encoding.GetEncoding("shift_jis"));
// 書きこんだ内容を読み込んで表示
System.Console.WriteLine(File.ReadAllText(filePath, Encoding.GetEncoding("shift_jis")));
}
}
.Net Coreの場合
C#はUTF-8推しらしく、.net coreにはシフトJISの設定が入っていないため、設定をNuGetから取得する必要があります。
取得の手順は、
https://www.nuget.org/packages/System.Text.Encoding.CodePages/
にアクセスして、設定インストール用のコマンドを確認します。
VisualStudioのメニューから「ツール」⇒「NuGet パッケージ マネージャー」⇒「パッケージ マネージャー コンソール」を選択
コードエディターの下にコンソールが表示されます。
先ほどの設定インストール用のコマンドを貼り付けてEnterキーで実行します。
ずらずらっとインストールが実行されます。
からのサンプルコード
using System;
using System.IO;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var filePath = @"D:\test_shiftJIS.txt";
var writeTextArray = new string[] {
"追加の書き込みテスト",
"同じ名前のファイルがなかったら",
"新規作成されます。"
};
// 文字コード情報を設定
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// 文字コードを指定して書き込み
File.AppendAllLines(filePath, writeTextArray, Encoding.GetEncoding("shift_jis"));
// 書きこんだ内容を文字コードを指定して読み込んで表示
Console.WriteLine(File.ReadAllText(filePath, Encoding.GetEncoding("shift_jis")));
}
}
}
17行目のように文字コードの設定を登録してから、各メソッドに文字コードの指定を渡します。
.NET6の場合
VisalStudio2022ではNuGetの手順はいらないみたい。
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント