C#でファイル操作するときはStream系のクラスを使用します。どんなに小さいファイルであってもたいてい以下のようなコードになるのですが若干記述量が多いのが気になります。
public static void Main(string[] args) { using(var sr = new StreamReader(@"hogehoge")) { while ((line = sr.ReadLine()) != null) { // 何らかの処理 } } }
そこで、単純な操作しかしない場合、Fileクラスに便利な機能が存在しているので、その紹介をしたいと思います。
ファイルの内容を全部読み取る
内容を全部取得して配列として取得します。ReadAllLinesは内容を一気に読んでメモリ上に展開します。大きいサイズのファイルの場合ReadLinesを使うのが無難です。(多分遅延読み取りしていると思います。が、これファイルのロックと解放ってどうなるんですかね…?)
// 全部を指定したエンコードで、改行を分割して読み取る string[] lines = File.ReadAllLines(@"d:\text.txt", Encoding.UTF8); // 遅延読み取りしたい場合こっち foreach(string line in File.ReadLines(@"d:\text.txt", Encoding.UTF8)) { // 1行ごとの処理 }
ファイルに文字列を書き込む
あらかじめ準備した文字列を一気にファイルに書き込みます。上書きになるため元のファイルの内容は消えます。オプションで追記などはできません。それは別のメソッドがあります。
string msg = "test"; File.WriteAllText(@"d:\out.txt", msg, Encoding.UTF8);
複数行書き込みたい場合は別のメソッドを使用します。
var msgList = new List<string>() { "0000", "1111", "2222" }; File.WriteAllText(@"d:\out.txt", msgList, Encoding.UTF8);
ファイルを追記する
既存のファイルに文字を追加したい場合は以下を使用します。
// 単一文字列の追記 string msg = "test"; File.AppendAllText(@"d:\app.txt", msg, Encoding.UTF8); // 複数文字列の追記 var msgList = new List<string>() { "0000", "1111", "2222" }; File.AppendAllLines(@"d:\app.txt", msgList, Encoding.UTF8);
ファイルに対するバイト操作
バイトレベルのファイルアクセスも可能です。この操作はけっこう使えます。
// ファイルの内容をバイト配列で取得する byte[] bytes = File.ReadAllBytes(@"d:\byte.txt"); // ファイルへバイトを書き込む File.WriteAllBytes(@"", new [] { 0x1, 0x2, 0x3 });
ファイルに対するStream操作
以下、これを使うくらいならStreamクラス使えよとなるかもしれませんが、Stream関係の高度な操作もできます。
以下例では、FileStreamを作成して受け取ることができます。
using(FileStream fs = File.Create(@"d:\fs.txt", 2048, FileOptions.RandomAccess)) { // 何らかの操作 }
StreamWriterを受け取って追記する事もできます。
using(StreamWriter sw = File.AppendText(@"d:\app.txt")) { // 何らかの操作 }
他にも色々ありますが残りは各自で確認してみてください。