HUSKING - kotteri

技術系Note

【C#】ファイルの読み書きを一度に行う

ファイルの一部を読み込んで書き換えをするのに、
一度別ファイルに書き出して置き換えるという手順が面倒だったので、
別ファイルを作成せずに行う方法を試してみた。


実行前のファイル(Text.txt)の中身

123456789
あいうえお

※ ファイルのエンコードは"UTF-8(BOM無し)"


今回試したこと

  1. 先頭の3文字「123」を読みだした後、「987」に書き換える

  2. 2行目の2~4文字「いうえ」を読みだした後、「イウエ」に書き替える


実際のコード

class Program
{
    static void Main(string[] args)
    {
        // EXEパスを取得
        var exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;

        // 読み書きするテキストファイルのパスを生成(以下の場合はEXEファイルと同じフォルダにあるものとする)
        var filePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(exePath), "Text.txt");



        /*
         * パターン1:最初の3文字を読み込んで、書き換える
         */

        // 読み書き可能モードでファイルを開く
        using (var fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None))
        {
            // 読み込み
            var rbuf = new byte[3];
            if (fs.Read(rbuf, 0, rbuf.Length) < 1)
            {
                Console.WriteLine("読み込みエラー");
                return;
            }
            // 読み込んだ文字列を出力
            Console.WriteLine($"パターン1:{Encoding.GetEncoding("utf-8").GetString(rbuf)}");

            // 書き換える文字を設定
            var wbuf = Encoding.GetEncoding("utf-8").GetBytes("987");
            // 書出し位置を先頭にもってくる
            fs.Seek(0, System.IO.SeekOrigin.Begin);
            // 書き換え
            fs.Write(wbuf, 0, wbuf.Length);
        }



        /*
         * パターン2:2行目の2~4文字目を読み込んで、書き換える
         */
        using (var fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None))
        {
            // 読出し位置を指定の位置に設定
            var offset = 9 + 1 + 1 + 3; // 1行目文字列 + CR + LF + 2行目全角1文字
            fs.Seek(offset, System.IO.SeekOrigin.Begin);
            // 読み込み
            var rbuf = new byte[3 * 3]; // 全角3文字      
            if (fs.Read(rbuf, 0, rbuf.Length) < 1)
            {
                Console.WriteLine("読み込みエラー");
                return;
            }
            // 読み込んだ文字列を出力
            Console.WriteLine($"パターン2:{Encoding.GetEncoding("utf-8").GetString(rbuf)}");

            // 書き換える文字を設定
            var wbuf = Encoding.GetEncoding("utf-8").GetBytes("イウエ");
            // 書出し位置を指定の位置に設定
            fs.Seek(offset, System.IO.SeekOrigin.Begin);
            // 書き換え
            fs.Write(wbuf, 0, wbuf.Length);
        }



        Console.ReadKey();
    }
}


コンソール出力

パターン1:123
パターン2:いうえ


実行後のファイル(Text.txt)の中身

987456789
あイウエお