ファイルアクセスの解説【C#を始めよう】

C#でプログラムを始めてみる連載の8回目です。前回の記事はコチラです。 hirocom777.hatenadiary.org

機能の実装

前回はフォームのメニューからファイルの読込み、保存ができるようにしました。

f:id:HiroCom777:20210915211832j:plain

今回は、このプログラムの解説をします。

ファイル読込みの解説

まずはファイル読込みのプログラムから解説します。以下に前回のコードを掲載します。ファイルメニューのOpenを選択したときの実行部分です。(コメント部分は削除しました。)

    private void mnuOpen_Click(object sender, EventArgs e)
    {
        System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Data\TEST.txt"); 
        this.txtMain.Text = sr.ReadToEnd();
        sr.Close();
    }

StreamReaderクラス

ファイルの読込みにはSystem.IO名前空間にあるStreamReaderクラスを使って対象のファイルにアクセスするオブジェクトを作ることで実現します。

上の例では、

System.IO.StreamReader オブジェクト名 = new System.IO.StreamReader(ファイル名); 

で、読み込むファイルを指定してオブジェクトを作成します。作成したオブジェクトは色々なメソッド(機能)や、プロパティ(属性)を持っています。今回は、そのうち以下を使いました。

オブジェクト名.ReadToEnd();

指定したファイルの内容を最後まで読み込んで返します。ここではtxtMainの表示に値を返しています。

オブジェクト名.Close();

オブジェクトをクローズして、関連するシステムリソースを開放します。

テキストファイルの書込み

続いてファイル書込みのプログラムを解説します。ファイルメニューのSaveを選択したときの実行部分です。以下に前回のコードを掲載します。

   private void mnuSave_Click(object sender, EventArgs e)
    {
        MessageBox.Show("ファイルを保存します", "TextEditor", MessageBoxButtons.OK);
        System.IO.StreamWriter wr = new System.IO.StreamWriter(@"C:\Data\TEST.txt");
        wr.Write(this.txtMain.Text);
        wr.Close();
    }

StreamWriterクラス

ファイルの書込みにはSystem.IO名前空間にあるStreamWriterクラスを使って対象のファイルにアクセスするオブジェクトを作ることで実現します。

上の例では、

System.IO.StreamWriter オブジェクト名 = new System.IO.StreamWriter(ファイル名); 

で、書き込むファイルを指定してオブジェクトを作成します。StreamReaderと同じく作成したオブジェクトは色々なメソッド(機能)や、プロパティ(属性)を持っています。今回は、そのうち以下を使いました。

オブジェクト名.Write(書込みデータ);

オブジェクト作成時に指定したファイルにデータを書き込みます。ここではtxtMainの表示内容を書き込んでいます。

オブジェクト名.Close();

オブジェクトをクローズして、関連するシステムリソースを開放します。StreamReaderと同じです。

以上が、前回のプログラムについての説明です。あまり難しいところはないと思います。

"@"って何?

ところで、1点気になるところがあります。ファイル名の前にある "@" です。これ、何のおまじないでしょうか?

C#では文字データを表すときにダブルクォーテーションで囲って表します。そして、その中で特殊な文字を含める場合 "\" と半角1文字で表します。これをエスケープシーケンスと呼びます。以下に、代表的なエスケープシーケンスを示します。

エスケープ
シーケンス
意味
\t タブ
\n 改行
\\ \
\b バックスペース

そして今回の例では、ファイルの指定という形で文字列の中に "\" が出てきます。これは、エスケープシーケンスではありませんので処理系にこの文字列の "\"エスケープシーケンスではない旨明示しなければなりません。そんな時に先頭に "@" を付けて表記して、以下の様にします。

@"C:\Data\TEST.txt"

これを 逐語的リテラル文字列 と言います。先頭に "@" を避けない場合、以下の様に書かなければなりません。

"C:\\Data\\TEST.txt"

"\" を2回表示してエスケープシーケンスとしての機能を打ち消しています。こちらを標準リテラル文字列と言います。

ファイル名などの指定では、エスケープシーケンスを無効にするため 逐語的リテラル文字列 を使うのが一般的です。

次回はファイル選択

今回はファイルアクセスの解説でした。動作の概要がお判りいただけたと思います。次回は機能アップです。ファイルを選択して処理できるようにしましょう。お楽しみに!!

hirocom777.hatenadiary.org C#で簡単なツールを作る連載記事はコチラからどうぞ