【やさしいC#】lesson9.4 各種ファイルの扱い

C#

画像ファイルを読み書きす

  各種ファイルの読み書きするプログラムをみていくことにしましょう。画像ファイルはかんたんに読み書きが可能になっています。

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace lesson9
{
    class sample4 : Form
    {
        private Button bt1, bt2;
        private FlowLayoutPanel flp;
        private Bitmap bmp;

        [STAThread]
        static void Main(string[] args)
        {
            Application.Run(new sample4());
        }
        public sample4()
        {
            this.Text = "lesson9";
            this.Width = 400; this.Height = 200;

            bmp = new Bitmap(400,300);

            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;

            bt1.Click += new EventHandler(bt_Click);
            bt2.Click += new EventHandler(bt_Click);
            this.Paint += new PaintEventHandler(fm_Paint);
        }
        public void bt_Click(object sender, EventArgs e)
        {
            if (sender == bt1)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "ビットマップファイル|*.bmp|JPEGファイル|*.jpg";

                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Image tmp = (Bitmap)Image.FromFile(ofd.FileName); //画像を読み込みます
                    bmp = new Bitmap(tmp);
                }
            }
            else if (sender == bt2)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "ビットマップファイル|*.bmp|JPEGファイル|*.jpg";

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    if (sfd.FilterIndex == 1) //1番目のフィルタであるビットマップの処理です
                    {
                        bmp.Save(sfd.FileName, ImageFormat.Bmp);//bitmapで保存します
                    }
                    else if (sfd.FilterIndex == 2) //2番目のフィルタであるJPEGの処理です
                    {
                        bmp.Save(sfd.FileName, ImageFormat.Jpeg);//JPEGで保存します
                    }
                }
            }
            this.Invalidate();
        }
        public void fm_Paint(Object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(bmp, 0, 0);
        }
    }
}
実行画面

  BitmapクラスのSave()メソッドを使って画像を保存することができます。ImageFormatクラスの静的フィールドを使って画像形式を指定することができます。

クラス説明
System.Drawing.Bitmapクラス
void Save(string fn, ImageFormat f)メソッド指定ファイルを指定したフォーマットで保存する
System.Drawing.Imaging.ImageFormatクラス
Bmpフィールドビットマップ形式を取得する
JpegフィールドJPEG形式を取得する
System.Windows.Form.SaveFileDialogクラス
FilterIndexプロパティフィルタに表示させる列を設定・取得する

テキスト処理を行う

  今度は簡単なテキストエディタプログラムを作成してみましょう。テキストボックスの機能を使うと、カット・コピー ・ ペースト処理が簡単にできます。
  処理を選択するにあたってでは、ツールバー(ToolStrip)を使うことにしましょう。このプログラムを起動するには、ツールバーのボタンに表示する画像としてCライブの下に「cut.bmp」「copy.bmp」「paste.bmp」が必要です

using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;

namespace lesson9
{
    class sample5 : Form
    {
        private TextBox tb;
        private ToolStrip ts;
        private ToolStripButton[] tsb = new ToolStripButton[3];
        private Button bt1, bt2;
        private FlowLayoutPanel flp;

        [STAThread]
        static void Main(string[] args)
        {
            Application.Run(new sample5());
        }
        public sample5()
        {
            this.Text = "lesson9";
            this.Width = 400; this.Height = 200;

            ts = new ToolStrip();//ツールバーを作成します
            for (int i = 0; i < tsb.Length; i++)
            {
                tsb[i] = new ToolStripButton();//ツールバーのボタンを作成します
            }
            tsb[0].Image = Image.FromFile("E:\\099_Technology\\C#\\csharp\\csharp_train\\lesson2\\google.JPG"); tsb[0].ToolTipText = "カット";
            tsb[1].Image = Image.FromFile("E:\\099_Technology\\C#\\csharp\\csharp_train\\lesson2\\google.JPG"); tsb[1].ToolTipText = "コピー";
            tsb[2].Image = Image.FromFile("E:\\099_Technology\\C#\\csharp\\csharp_train\\lesson2\\google.JPG"); tsb[2].ToolTipText = "ペースト";

            tb = new TextBox();
            tb.Multiline = true;//テキストボックスを複数行表示にします
            tb.Width = this.Width;tb.Height = this.Height - 100;
            tb.Dock = DockStyle.Top;

            bt1 = new Button();
            bt2 = new Button();
            bt1.Text = "読込";
            bt2.Text = "保存";

            flp = new FlowLayoutPanel();
            flp.Dock = DockStyle.Bottom;

            for (int i = 0; i < tsb.Length; i++)
            {
                ts.Items.Add(tsb[i]);
            }

            bt1.Parent = flp;
            bt2.Parent = flp;
            flp.Parent = this;
            tb.Parent = this;
            ts.Parent = this;

            bt1.Click += new EventHandler(bt_Click);
            bt2.Click += new EventHandler(bt_Click);

            for (int i = 0; i < tsb.Length; i++)
            {
                tsb[i].Click += new EventHandler(tsb_Click);
            }
        }
        public void tsb_Click(Object sender, EventArgs e)
        {
            if (sender == tsb[0])
            {
                tb.Cut();
            }
            else if (sender == tsb[1])
            {
                tb.Copy();
            }
            else if (sender == tsb[2])
            {
                tb.Paste();
            }
        }
        public void bt_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "テキストファイル|*.txt";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                if (sender == bt1)
                {
                    StreamReader sr =new StreamReader(ofd.FileName,System.Text.Encoding.Default);
                    tb.Text = sr.ReadToEnd();
                    sr.Close();
                }
                else if (sender == bt2)
                {
                    StreamWriter sw =new StreamWriter(ofd.FileName);
                    sw.WriteLine(tb.Text);
                    sw.Close();
                }
            }
        }
    }
}
実行画面

  ここではツールバーと呼ばれるToolStripクラスと、そのボタンであるToolStrip Buttonクラスを使っています。ボタンを押したときに、テキストボックスのCut(), Copy(), Paste()メソッドを使って処理を行っています。

XML文書を表形式で表示する

  設定ファイルや各種のデータを保存する際には、XML文書を利用することも多く行われています。
  そこでXML文書を扱う方法をみていきましょう。データグリットビュー(Data Grid View)コントロールを使うと、XML文書をかんたんに表形式で表示することができます。ここではCドライブの下に次のsample.xmlを作成したうえで、読み込んでみることにしましょう。保存したかどうか確認してから実行してください。また、ビルドの実行には「参照の追加」が必要です。「System.Data」と「System.Xml」を追加してください。

<?xml version="1.0" encoding="utf-8" ?>
<!--  sample.xml   -->
<cars>
  <car id="1001" country="日本">
    <name>乗用車</name>
    <price>150</price>
    <description>
      5人まで乗車することができます。
      <em>家族用</em>
      の車です。
    </description>
    <img file="car1.jpg" />
  </car>
  
  <car id="2001" country="日本">
    <name>トラック</name>
    <price>360</price>
    <description>
      <em>荷物の運搬</em>
      にご利用できます。
      <em>業務用</em>
      の車です。
    </description>
    <img file="car2.jpg" />
  </car>
  
  <car id="1005" country="USA">
    <name>オーブンカー</name>
    <price>200</price>
    <description>
      晴天時には天窓を開閉できます。
      <em>レジャー用</em>
      の最適です。
    </description>
    <img file="car3.jpg" />
  </car>
</cars>
//sample6.cs
using System.Windows.Forms;
using System.Xml;
using System.Data;

namespace lesson9
{
    class sample6 :Form 
    {
        private DataSet ds;
        private DataGridView dg;

        static void Main(string[] args)
        {
            Application.Run(new sample6());
        }
        public sample6()
        {
            this.Text = "lesson9";this.Width = 600; this.Height = 300;

            ds = new DataSet();//データセットを作成します
            ds.ReadXml("E:\\099_Technology\\C#\\csharp\\csharp_train\\lesson9\\sample.xml");//データセットにXML文書を読み込みます

            dg = new DataGridView();//データグリッドビューを作成します
            dg.Width = 500; dg.Height = 200;
            dg.DataSource = ds.Tables[0];//DataSourceのプロパティに設定します

            dg.Parent = this;
        }
    }
}
実行画面

  XML文書を表示するには、データを扱うクラスであるデータセット(DateSet)を作成して、XML文書の内容を読み込みます。
  このデータセットの最初の行をデータグリッドレビューのDataSourceプロパティに設定すると、XML文書の内容が表形式で表示されます。
  データグリッドビューは、このほかにはさまざまなデータを表形式に表示することができるようになっています。

データグリッドビューにXML文書を表示することができる。
データグリッドビューは、データを表形式で表示する。

XML文書を木構造で表示する

  XMLは入れ子になった階層構造でデータを表す形式となっています。このため、木構造をもつツリービュー(Tree View)コントロールを使うと、さらにXML文書の内容を見やすく表示することができます。このプログラムの実行にも、XMLファイルの保存と「System.Xml」参照の追加が必要です。

//sample7.cs
using System.Windows.Forms;
using System.Xml;

namespace lesson9
{
    class sample7 : Form
    {
        private TreeView tv;
        static void Main(string[] args)
        {
            Application.Run(new sample7());
        }
        public sample7()
        {
            this.Text = "lesson9"; this.Width = 600; this.Height = 400;

            tv = new TreeView();//ツリービューを作成します
            tv.Dock = DockStyle.Fill;

            XmlDocument doc = new XmlDocument();
            doc.Load("E:\\099_Technology\\C#\\csharp\\csharp_train\\lesson9\\sample.xml");//①文書を読み込みます

            XmlNode xmlroot = doc.DocumentElement;//ルートノードを取得します
            TreeNode treeroot = new TreeNode();
            treeroot.Text = xmlroot.Name;//ルートノードをツリーのルートとします
            tv.Nodes.Add(treeroot);

            walk(xmlroot, treeroot);//②子の処理を行います。

            tv.Parent = this;
        }
        public static void walk(XmlNode xn, TreeNode tn)
        {
            for (XmlNode ch = xn.FirstChild; ch != null; ch = ch.NextSibling)//子ノードについて順に処理します
            {
                TreeNode n = new TreeNode();
                tn.Nodes.Add(n);
                walk(ch, n);//③子ノードについて同じ処理を繰り返します

                if (ch.NodeType == XmlNodeType.Element)//要素の場合に、...
                {
                    n.Text = ch.Name;//要素名のツリーノードに設定します
                }
                else//要素以外の場合
                {
                    n.Text = ch.Value;//値をツリーノードに設定します
                }
            }
        }

    }
}
実行画面

  XML文書を読み込むには、XmlDocumentクラスを使います。Load()メソッドによってXMLファイルを読み込むことができます(①)。
  XML文書のノードを扱うには、XmlNodeクラスを使います。また、ツリービューのノードはTreeNodeクラスを使います。文書のルートとなっているXmlNodeの最初の子から子ノードを順に処理していきます(②)。子にさらに子があれば、同じ処理を繰り返します(③)。
  この繰り返しの処理の中で、このノードにXMLの要素名またはテキスト値を設定していくのです。
  こうしてツリービューにXMLの要素名やテキストが表示されることになります。

ツリービューは、データを木構造で表示する。

クラス説明
System.Windows.Forms.TreeViewクラス
TreeView()コンストラクタツリービューを作成します
Nodesプロパティツリーの最初の子ノードリストを設定・取得する
System.Window.Forms.TreeNodeクラス
TreeNode()コンストラクタツリーノードを作成します
Textプロパティノード名を設定・取得する
System.Xml.XmlDocumentクラス
XmlDocument()コンストラクタ文書を作成します
void Load(string s)メソードXML文書を読み込む
System.Xml.XmlNodeクラス
XmlNode()コンストラクタXMLノードを作成します
FirstChildプロパティ最初の子を得る
NextSliblingプロパティ次の子を得る
NodeTypeプロパティノードの種類を設定・取得する
Nameプロパティノード名を設定・取得する
Valueプロパティノード値を設定・取得する

コメント

タイトルとURLをコピーしました