C#で簡単なファイル操作を行う

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"))
{
    // 何らかの操作
}

他にも色々ありますが残りは各自で確認してみてください。