C#では、いろいろな「ファイル」を扱いますが、今回は一番よく使われる「テキストファイル」の読み書きについて書きます。
ファイルアクセスのためのクラスは、C#では「System.IO名前空間」のクラスで行うことができます。
ファイルへのアクセスの基本
C言語などでは、
- ファイルを開く
- データを(読み込む/書き込む)
- ファイルを閉じる
の順で処理を行います。
C#でも基本は同じですが、「1.ファイルを開く」と「3. ファイルを閉じる」は、C言語ほどはっきり見えません。
ですが、C#の場合、逆にこの部分は「フレームワークがやってくれている」と思っていい部分でもあります。
ファイルからテキストを読み取る
ファイルからテキストを読み取るには「System.IO.StreamReader」で行います。
下記がサンプルです。
static void Main(string[] args) { string file_path = System.IO.Path.Combine(@".\test.txt"); if (!System.IO.File.Exists(file_path)) { return; } // ファイルからデータを読み取る string file_data = string.Empty; // ファイルのデータ using (System.IO.StreamReader sr = new System.IO.StreamReader(file_path)) // UTF-8のテキスト用 //using (System.IO.StreamReader sr = new System.IO.StreamReader(file_path, Encoding.GetEncoding("shift-jis"))) // シフトJISのテキスト用 { file_data = sr.ReadToEnd(); // ファイルのデータを「すべて」取得する } Console.WriteLine(file_data); }
このサンプルでは、”test.txt”というテキストファイルのデータを読み取るのですが、気を付けていただきたいのは「日本語」でデータを作るときの文字コードは「UTF-8」で作るようにしてください。
テキストファイルの日本語が「UTF-8」でないと表示で文字化けしてしまいます。
ファイルへテキストデータを書き込む
ファイルからテキストデータを書き込むには「System.IO.StreamWriter」で行います。
下記がサンプルです。
static void Main(string[] args) { string file_path = System.IO.Path.Combine(@".\test.txt"); // ファイルへテキストデータを書き込む string file_data = "データその1\r\nデータその2\r\n"; // ファイルのデータ using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file_path)) // UTF-8のテキスト用 //using (System.IO.StreamWriter sw = new System.IO.StreamWriter(file_path, Encoding.GetEncoding("shift-jis"))) // シフトJISのテキスト用 { sw.Write(file_data); // ファイルへテキストデータを出力する } }
このサンプルでテキストデータを出力すると、テキストデータは「UTF-8」で出力されます。
ここで重要なのは、ファイルの読み書きには「文字コード」の指定があり、現在のC#で取り扱う標準の文字コードは「UTF-8」で、C#のソースコードも文字コードは「UTF-8」です。
ファイルはいつ開いていつ閉じている?
上記のサンプルコードで「ファイルはいつ開いていつ閉じているのか」という疑問があると思います。
このサンプルコードの場合は、はっきりしています。
行でいうと using( … ) { の行でファイルを開き、この using のブロックが閉じるところで、ファイルを閉じています。
StreamReaderやStreamWriterから言うと、オブジェクトを生成したときにファイルを開き、オブジェクトを破棄するときにファイルを閉じています。