ファイルを利用する (1/5)
作成:2013-09-14 10:38
更新:2013-09-14 10:38
更新:2013-09-14 10:38
■StreamReaderとテキストの書き出し
ファイルアクセスのためのクラスは、C#では「System.IO」というパッケージにまとめられています。この中にあるクラスの使い方を覚えれば、ファイルを利用する基本的な方法はだいたいわかるでしょう。
ここでは、ファイルアクセスの基本ともいえる「テキストファイル」の利用の仕方から説明しましょう。まずはテキストファイルの書き出し(ファイルへの保存)からです。
これは、System.IOの「StreamWriter」というクラスを利用するのが一般的でしょう。これは以下のようにしてインスタンスを作成します。
引数には、書き出すファイルを指定するものが入ります。これは一般的には、ファイルのパスを示すテキストを渡せばいいでしょう。こうしたインスタンスを作成したら、そこにテキストを書き出すだけです。
・テキストを書き出す
・テキストを書き出し改行する
・バッファに残る値をすべて書き出す
値をファイルに書き出すには「Write」か「WriteLine」を用います。Writerは値をそのまま書き出します。WriterLineは値を書きだした後で改行コードを追加します(つまりそこで改行する)。これらを必要なだけ呼び出すことで値を書き出していくことができます。引数にはテキストだけでなく、基本的な値であればどんなものでも渡すことができます。
これらの書き出し処理は、実行速度を向上させるためにStreamWriterに用意されたバッファに書き出す値を保存し、それを順次ファイルに保存するようになっています。このため、保存を行う際には「バッファに、まだ書き出しする値が残っていないか」をチェックするようにします。「Flush」は、バッファに残っている値を強制的に書き出すもので、値を書き出したら最後に一度これを呼びすようにすれば、「バッファに残っている値が書きだされてなかった」といったこともなくなります。
では、実際に簡単な例を下にあげておきましょう。これはTextBoxに書いたテキストを「data.txt」という名前で保存するものです。実行後、TextBoxに適当に文を書き、ボタンを押してください。プロジェクトの「bin」フォルダ内にある「Debug」か「Release」のどちらかの中に「data.txt」が作成されます(どちらのフォルダに保存されるかは実行時の設定によります)。
サンプルコードを見ると、StreamWrterを作成して保存するのにちょっと変わった書き方をしていることがわかりますね。こんな感じです。
これは「using文」という構文を使って書いているのです。このusing文は、「インスタンスを使用後に破棄する」という場合に用いられる構文です。usingの後の()内でインスタンスを作成し、{}内でそのインスタンスを使った処理を記述していきます。
このusing文は、{}にある処理を実行した後、そこを抜け出す際に、()で作ったインスタンスを自動的に破棄します。これは、例えば{}部分でエラーが発生したような場合でも、必ず構文を抜ける際にはインスタンスが破棄されるのです。このため、このStreamWriterなど「使用後にオブジェクトを破棄する」というもので必ずと言っていいほど用いられます。ここで合わせて覚えておきましょう。
ここでは、ファイルアクセスの基本ともいえる「テキストファイル」の利用の仕方から説明しましょう。まずはテキストファイルの書き出し(ファイルへの保存)からです。
これは、System.IOの「StreamWriter」というクラスを利用するのが一般的でしょう。これは以下のようにしてインスタンスを作成します。
変数 = new StreamWriter( ファイルの指定 );
引数には、書き出すファイルを指定するものが入ります。これは一般的には、ファイルのパスを示すテキストを渡せばいいでしょう。こうしたインスタンスを作成したら、そこにテキストを書き出すだけです。
・テキストを書き出す
《StreamWriter》.Write( 保存する値 );
・テキストを書き出し改行する
《StreamWriter》.WriteLine( 保存する値 );
・バッファに残る値をすべて書き出す
《StreamWriter》.Flush();
値をファイルに書き出すには「Write」か「WriteLine」を用います。Writerは値をそのまま書き出します。WriterLineは値を書きだした後で改行コードを追加します(つまりそこで改行する)。これらを必要なだけ呼び出すことで値を書き出していくことができます。引数にはテキストだけでなく、基本的な値であればどんなものでも渡すことができます。
これらの書き出し処理は、実行速度を向上させるためにStreamWriterに用意されたバッファに書き出す値を保存し、それを順次ファイルに保存するようになっています。このため、保存を行う際には「バッファに、まだ書き出しする値が残っていないか」をチェックするようにします。「Flush」は、バッファに残っている値を強制的に書き出すもので、値を書き出したら最後に一度これを呼びすようにすれば、「バッファに残っている値が書きだされてなかった」といったこともなくなります。
では、実際に簡単な例を下にあげておきましょう。これはTextBoxに書いたテキストを「data.txt」という名前で保存するものです。実行後、TextBoxに適当に文を書き、ボタンを押してください。プロジェクトの「bin」フォルダ内にある「Debug」か「Release」のどちらかの中に「data.txt」が作成されます(どちらのフォルダに保存されるかは実行時の設定によります)。
■using文について
サンプルコードを見ると、StreamWrterを作成して保存するのにちょっと変わった書き方をしていることがわかりますね。こんな感じです。
using ( インスタンスの作成 )
{
……保存の処理……
}
これは「using文」という構文を使って書いているのです。このusing文は、「インスタンスを使用後に破棄する」という場合に用いられる構文です。usingの後の()内でインスタンスを作成し、{}内でそのインスタンスを使った処理を記述していきます。
このusing文は、{}にある処理を実行した後、そこを抜け出す際に、()で作ったインスタンスを自動的に破棄します。これは、例えば{}部分でエラーが発生したような場合でも、必ず構文を抜ける際にはインスタンスが破棄されるのです。このため、このStreamWriterなど「使用後にオブジェクトを破棄する」というもので必ずと言っていいほど用いられます。ここで合わせて覚えておきましょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
using System; using System.Drawing; using System.IO; using System.Windows.Forms; namespace MyFrmApp { public class MyForm : Form { private Label label; private TextBox box; private Button btn; public MyForm() { this.Width = 300; this.Height = 250; setupControls(); } public void setupControls() { label = new Label(); label.Text = "type text:"; label.Font = new Font("Geneva",12,FontStyle.Regular); label.Height = 30; label.Width = 300; this.Controls.Add(label); box = new TextBox(); box.Multiline = true; box.Width = 225; box.Height = 100; box.Top = 50; box.Left = 25; this.Controls.Add(box); btn = new Button(); btn.Text = "click"; btn.Height = 30; btn.Width = 100; btn.Top = 160; btn.Left = 100; btn.Click += btn_Click; this.Controls.Add(btn); } private void btn_Click(object sender, System.EventArgs e) { using (StreamWriter writer = new StreamWriter("data.txt")) { writer.Write(box.Text); writer.Flush(); } } } }
※関連コンテンツ