バイナリファイルを読み書きする
テキストファイルは、大変扱いやすいファイルとなっています。しかし、ファイルの内容によっては、ファイルサイズが大きくなったり、読み書きに時間がかかってしまうことがあります。
このようなとき、バイナリファイル(binary file)を扱う便利です。バイナリファイルは、コンピュータ内部で扱われる形式のままにデータを扱うファイルです。さっそくコードを作成してみることにしましょう。
using System;
using System.Windows.Forms;
using System.IO;
namespace lesson9
{
class sample3 : Form
{
private TextBox[] tb = new TextBox[5];
private Button bt1, bt2;
private FlowLayoutPanel flp;
[STAThread]
static void Main(string[] args)
{
Application.Run(new sample3());
}
public sample3()
{
this.Text = "lesson9";
this.Width = 200; this.Height = 200;
for (int i = 0; i < tb.Length; i++)
{
tb[i] = new TextBox();
tb[i].Width = 30; tb[i].Height = 30;
tb[i].Top = 0; tb[i].Left = i * tb[i].Width;
tb[i].Text = Convert.ToString(i);
}
bt1 = new Button();
bt2 = new Button();
bt1.Text = "読込";
bt2.Text = "保存";
flp = new FlowLayoutPanel();
flp.Dock = DockStyle.Bottom;
bt1.Parent = flp;
bt2.Parent = flp;
flp.Parent = this;
for (int i = 0; i < tb.Length; i++)
{
tb[i].Parent = this;
}
bt1.Click += new EventHandler(bt_Click);
bt2.Click += new EventHandler(bt_Click);
}
public void bt_Click(object sender, EventArgs e)
{
if (sender == bt1)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "バイナリファイル|*.bin";
if (ofd.ShowDialog() == DialogResult.OK)
{
BinaryReader br =
new BinaryReader
(new FileStream(ofd.FileName,FileMode.Open,FileAccess.Read));
for (int i = 0; i < tb.Length; i++)
{
int num = br.ReadInt32();
tb[i].Text = Convert.ToString(num);
}
br.Close();
}
}
else if (sender == bt2)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "バイナリファイル|*.bin";
if (ofd.ShowDialog() == DialogResult.OK)
{
BinaryWriter br =
new BinaryWriter
(new FileStream(ofd.FileName, FileMode.OpenOrCreate, FileAccess.Write));
for (int i = 0; i < tb.Length; i++)
{
br.Write(Convert.ToInt32(tb[i].Text));
}
br.Close();
}
}
}
}
}
バイナリファイルを扱うには、バイトストリーム(byte stream)と呼ばれるストリームを使います。バイトストリームFileStreamを開く際には、ファイルモード・ファイルアクセスを指定します。ファイルモードは次の値を指定します。
ファイルモード | 説明 |
---|---|
Append | 末尾に追加 |
Open | 既存のファイルを開く |
OpenOrCreate | 既存のファイルを開く、また新規作成 |
Create | 新規作成 |
CreateNew | 新規作成(ファイルが存在する場合は上書き) |
Truncate | 既存のファイルを開いて上書き |
ファイルアクセスは次の値を指定します。
ファイルアクセス | 説明 |
---|---|
Read | 読み込み |
ReadWrite | 読み書き |
Write | 書き込み |
バイナリファイルの読み書きにはBinaryReader、BinaryWriterクラスを使います。
ここではデータを整数型のまま読み書きしているので、テキストファイルとして扱うよりも、ファイルサイズが小さくなります。ただし、このプログラムで作成したファイルは、通常のテキストエディタで編集することはできません。
コメント