Visual C# で基本的なファイルの入出力を行う方法


Visual Basic .NET については、次の資料を参照してください。304427

Visual C++ .NET については、次の資料を参照してください。307398


この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.IO
  • System.Collections

概要


この資料では、Microsoft Visual C# で 6 つのファイルの基本入出力 (I/O) 操作を行う方法について手順を追って説明します。 Microsoft .NET Framework を初めて使用する場合、.NET のファイル操作のためのオブジェクト モデルが、Microsoft Visual Studio 6.0 を使用する開発者の多くに馴染みのある FileSystemObject (FSO) に似ていることがわかります。 より簡単に移行できるように、この資料では、次のサポート技術情報の資料を基にこの機能について説明します。
186118 Visual Basic で FileSystemObject を使用する方法

FileSystemObject は .NET でも使用することができます。 FileSystemObject はコンポーネント オブジェクト モデル (COM) コンポーネントであるため、.NET は相互運用層経由でオブジェクトにアクセスする必要があります。 このオブジェクトを使用する場合、.NET によってコンポーネントのラッパーが生成されます。 ただし、.NET Framework の FileFileInfoDirectoryDirectoryInfo および他の関連クラスは、FSO で使用できない機能を提供し、相互運用層のオーバーヘッドもありません。

必要条件

必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は、次のとおりです。
  • Visual C#

ファイル入出力操作の説明

この資料の例では、基本的なファイル入出力操作について説明します。 サンプル プロジェクトの作成と実行では、以下のファイル入出力操作を説明するサンプル プログラムの作成方法を説明します。
  • テキスト ファイルの読み取り
  • テキスト ファイルへの書き込み
  • ファイル情報の表示
  • ディスク ドライブの一覧
  • フォルダの一覧
  • ファイルの一覧
注: 後に示すサンプル コードを直接使用する場合、次のことに注意してください。
  • 次のように System.IO 名前空間を含める必要があります。
    using System.IO;
  • 次のように winDir 変数を宣言する必要があります。
    string    winDir=System.Environment.GetEnvironmentVariable("windir");
  • 次のように addListItem 関数を宣言します。
    private void addListItem(string value)
    {
    this.listBox1.Items.Add(value);
    }
    注: addListItem 関数を宣言して使用する代わりに、次のステートメントを直接使用することができます。
    this.listBox1.Items.Add(value);"

テキスト ファイルの読み取り

次のサンプル コードでは、StreamReader クラスを使用して、System.ini ファイルを読み取ります。 ファイルの内容は ListBox コントロールに追加されます。 try...catch ブロックは、ファイルが空の場合にプログラムに警告するために使用します。 ファイルの最後に到達したことを判断する方法は多数ありますが、このサンプルでは、Peek メソッドを使用して、ファイルを読み取る前に次の行を調べています。
    StreamReader reader=new  StreamReader(winDir + "\\system.ini");
try
{
do
{
addListItem(reader.ReadLine());
}
while(reader.Peek() != -1);
}

catch
{
addListItem("File is empty");}

finally
{
reader.Close();
}

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

このサンプル コードでは、StreamWriter クラスを使用して、ファイルの作成と書き込みを行います。 既存のファイルがある場合、同じ方法でそのファイルを開くことができます。
    StreamWriter writer = new StreamWriter("c:\\KBTest.txt");
writer.WriteLine("File created using StreamWriter class.");
writer.Close();
this.listbox1.Items.Clear();
addListItem("File Written to C:\\KBTest.txt");

ファイル情報の表示

このサンプル コードでは、FileInfo オブジェクトを使用して、ファイルのプロパティにアクセスします。 このサンプルでは、Notepad.exe のプロパティにアクセスします。 プロパティは ListBox コントロールに表示されます。
    FileInfo FileProps  =new FileInfo(winDir + "\\notepad.exe");
addListItem("File Name = " + FileProps.FullName);
addListItem("Creation Time = " + FileProps.CreationTime);
addListItem("Last Access Time = " + FileProps.LastAccessTime);
addListItem("Last Write TIme = " + FileProps.LastWriteTime);
addListItem("Size = " + FileProps.Length);
FileProps = null;

ディスク ドライブの一覧

このサンプル コードでは、Directory および Drive クラスを使用して、システム上の論理ドライブの一覧を取得します。 このサンプルでは、結果が ListBox コントロールに表示されます。
    string[] drives = Directory.GetLogicalDrives();
foreach(string drive in drives)
{
addListItem(drive);
}

サブフォルダの一覧

このサンプル コードでは、Directory クラスの GetDirectories メソッドを使用して、フォルダーの一覧を取得します。
    string[] dirs = Directory.GetDirectories(winDir);
foreach(string dir in dirs)
{
addListItem(dir);
}

ファイルの一覧

このサンプル コードでは、Directory クラスの GetFiles メソッドを使用して、ファイルの一覧を取得します。
    string[] files= Directory.GetFiles(winDir);
foreach (string i in files)
{
addListItem(i);
}
ファイルの一覧を取得するときに、ファイルへのアクセスに失敗する場合があります。 原因として考えられるのは、ファイルが存在しない、ファイルが使用中である、ユーザーがアクセスしようとするファイルやそのファイルが存在するフォルダーに対して権限がない、などです。 コードを作成するときにこれらの可能性を考え、生成される例外の処理を考慮することが重要です。

手順例

  1. Visual C# で、新しい Windows Forms Application を作成します。 デフォルトで Form1 が作成されます。
  2. Form1 (Form1.cs) のコード ウィンドウを開きます。
  3. Form1.cs のすべてのコードを削除します。
  4. コード エディターに次のコードを貼り付けます。
    using System.Windows.Forms;
    using System.IO;

    namespace fso_cs
    {
    public partial class Form1 : Form
    {
    string winDir = System.Environment.GetEnvironmentVariable("windir");

    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
    //How to read a text file.
    //try...catch is to deal with a 0 byte file.
    this.listBox1.Items.Clear();
    StreamReader reader = new StreamReader(winDir + "\\system.ini");
    try {
    do {
    addListItem(reader.ReadLine());
    }
    while (reader.Peek() != -1);
    }
    catch {
    addListItem("File is empty");
    }
    finally {
    reader.Close();
    }
    }

    private void button2_Click(object sender, System.EventArgs e)
    {
    //Demonstrates how to create and write to a text file.
    StreamWriter writer = new StreamWriter("c:\\KBTest.txt");
    writer.WriteLine("File created using StreamWriter class.");
    writer.Close();
    this.listBox1.Items.Clear();
    addListItem("File Written to C:\\KBTest.txt");
    }

    private void button3_Click(object sender, System.EventArgs e)
    {
    //How to retrieve file properties (example uses Notepad.exe).
    this.listBox1.Items.Clear();
    FileInfo FileProps = new FileInfo(winDir + "\\notepad.exe");
    addListItem("File Name = " + FileProps.FullName);
    addListItem("Creation Time = " + FileProps.CreationTime);
    addListItem("Last Access Time = " + FileProps.LastAccessTime);
    addListItem("Last Write TIme = " + FileProps.LastWriteTime);
    addListItem("Size = " + FileProps.Length);
    FileProps = null;
    }

    private void button4_Click(object sender, System.EventArgs e)
    {
    //Demonstrates how to obtain a list of disk drives.
    this.listBox1.Items.Clear();
    string[] drives = Directory.GetLogicalDrives();
    foreach (string drive in drives)
    {
    addListItem(drive);
    }
    }

    private void button5_Click(object sender, System.EventArgs e)
    {
    //How to get a list of folders (example uses Windows folder).
    this.listBox1.Items.Clear();
    string[] dirs = Directory.GetDirectories(winDir);
    foreach (string dir in dirs)
    {
    addListItem(dir);
    }
    }

    private void button6_Click(object sender, System.EventArgs e)
    {
    //How to obtain list of files (example uses Windows folder).
    this.listBox1.Items.Clear();
    string[] files = Directory.GetFiles(winDir);
    foreach (string i in files)
    {
    addListItem(i);
    }
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
    this.button1.Text = "Read Text File";
    this.button2.Text = "Write Text File";
    this.button3.Text = "View File Information";
    this.button4.Text = "List Drives";
    this.button5.Text = "List Subfolders";
    this.button6.Text = "List Files";
    }

    private void addListItem(string value)
    {
    this.listBox1.Items.Add(value);
    }
    }
    }
  5. Form1.Designer.cs のコード ウィンドウを開きます。
  6. Form1.Designer.cs のコードをすべて削除します。
  7. Form1.Designer.cs に次のコードを貼り付けます。
    namespace fso_cs
    {
    partial class Form1
    {
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
    if (disposing && (components != null))
    {
    components.Dispose();
    }
    base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    this.button3 = new System.Windows.Forms.Button();
    this.button4 = new System.Windows.Forms.Button();
    this.button5 = new System.Windows.Forms.Button();
    this.button6 = new System.Windows.Forms.Button();
    this.listBox1 = new System.Windows.Forms.ListBox();
    this.SuspendLayout();
    //
    // button1
    //
    this.button1.Location = new System.Drawing.Point(53, 30);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(112, 23);
    this.button1.TabIndex = 1;
    this.button1.Text = "button1";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    //
    // button2
    //
    this.button2.Location = new System.Drawing.Point(53, 62);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(112, 23);
    this.button2.TabIndex = 2;
    this.button2.Text = "button2";
    this.button2.Click += new System.EventHandler(this.button2_Click);
    //
    // button3
    //
    this.button3.Location = new System.Drawing.Point(53, 94);
    this.button3.Name = "button3";
    this.button3.Size = new System.Drawing.Size(112, 23);
    this.button3.TabIndex = 3;
    this.button3.Text = "button3";
    this.button3.Click += new System.EventHandler(this.button3_Click);
    //
    // button4
    //
    this.button4.Location = new System.Drawing.Point(53, 126);
    this.button4.Name = "button4";
    this.button4.Size = new System.Drawing.Size(112, 23);
    this.button4.TabIndex = 4;
    this.button4.Text = "button4";
    this.button4.Click += new System.EventHandler(this.button4_Click);
    //
    // button5
    //
    this.button5.Location = new System.Drawing.Point(53, 158);
    this.button5.Name = "button5";
    this.button5.Size = new System.Drawing.Size(112, 23);
    this.button5.TabIndex = 5;
    this.button5.Text = "button5";
    this.button5.Click += new System.EventHandler(this.button5_Click);
    //
    // button6
    //
    this.button6.Location = new System.Drawing.Point(53, 190);
    this.button6.Name = "button6";
    this.button6.Size = new System.Drawing.Size(112, 23);
    this.button6.TabIndex = 6;
    this.button6.Text = "button6";
    this.button6.Click += new System.EventHandler(this.button6_Click);
    //
    // listBox1
    //
    this.listBox1.FormattingEnabled = true;
    this.listBox1.Location = new System.Drawing.Point(204, 30);
    this.listBox1.Name = "listBox1";
    this.listBox1.Size = new System.Drawing.Size(270, 199);
    this.listBox1.TabIndex = 7;
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    this.ClientSize = new System.Drawing.Size(525, 273);
    this.Controls.Add(this.button6);
    this.Controls.Add(this.button5);
    this.Controls.Add(this.button4);
    this.Controls.Add(this.button3);
    this.Controls.Add(this.button2);
    this.Controls.Add(this.button1);
    this.Controls.Add(this.listBox1);
    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    this.ResumeLayout(false);
    }
    #endregion

    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;
    private System.Windows.Forms.Button button3;
    private System.Windows.Forms.Button button4;
    private System.Windows.Forms.Button button5;
    private System.Windows.Forms.Button button6;
    private System.Windows.Forms.ListBox listBox1;
    }
    }
  8. 注: Visual C# で Windows フォーム プロジェクトを作成すると、既定で 1 つのフォームがプロジェクトに追加されます。 このフォームの名前は Form1 です。 このフォームを表す 2 つのソース コード ファイルは、Form1.cs と Form1.designer.cs です。 ユーザーによるコードの記述は Form1.cs ファイルで行います。 Form1.designer.cs ファイルには、Windows フォーム デザイナーで生成されたコードが書き込まれます。 前述の手順のコードはこの編成を反映しています。
    Visual C# .NET 2003 など、Visual C# の以前のバージョンでは、フォームごとに 1 つのソース ファイルのみを使用する別のプロジェクト編成を使用しています。 この手順は、Visual C# .NET 2003 または Visual C# .NET 2002 のみに適用されます。

    Visual C# .NET 2003 を使用している場合は、Form1 (Form1.cs) のコード ウィンドウを開きます。 Form1.cs のすべてのコードを削除します。 次のコードを Form1.cs に貼り付けます。
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;

    namespace fso_cs
    {

    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;
    private System.Windows.Forms.Button button3;
    private System.Windows.Forms.Button button4;
    private System.Windows.Forms.Button button5;
    private System.Windows.Forms.Button button6;
    string winDir=System.Environment.GetEnvironmentVariable("windir");
    private System.Windows.Forms.ListBox listbox1;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public Form1()
    {
    //
    // Required for Windows Form Designer support.
    //
    InitializeComponent();

    //
    // TO DO: Add any constructor code after InitializeComponent call.
    //
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
    this.button1 = new System.Windows.Forms.Button();
    this.button2 = new System.Windows.Forms.Button();
    this.button3 = new System.Windows.Forms.Button();
    this.listbox1 = new System.Windows.Forms.ListBox();
    this.button4 = new System.Windows.Forms.Button();
    this.button5 = new System.Windows.Forms.Button();
    this.button6 = new System.Windows.Forms.Button();
    this.SuspendLayout();
    //
    // button1
    //
    this.button1.Location = new System.Drawing.Point(216, 32);

    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(112, 23);
    this.button1.TabIndex = 1;
    this.button1.Text = "button1";
    this.button1.Click += new System.EventHandler(this.button1_Click);
    //
    // button2
    //
    this.button2.Location = new System.Drawing.Point(216, 64);
    this.button2.Name = "button2";
    this.button2.Size = new System.Drawing.Size(112, 23);
    this.button2.TabIndex = 2;
    this.button2.Text = "button2";
    this.button2.Click += new System.EventHandler(this.button2_Click);
    //
    // button3
    //
    this.button3.Location = new System.Drawing.Point(216, 96);
    this.button3.Name = "button3";
    this.button3.Size = new System.Drawing.Size(112, 23);
    this.button3.TabIndex = 3;
    this.button3.Text = "button3";
    this.button3.Click += new System.EventHandler(this.button3_Click);
    //
    // listbox1
    //
    this.listbox1.Location = new System.Drawing.Point(24, 24);
    this.listbox1.Name = "listbox1";
    this.listbox1.Size = new System.Drawing.Size(176, 199);
    this.listbox1.TabIndex = 0;
    //
    // button4
    //
    this.button4.Location = new System.Drawing.Point(216, 128);
    this.button4.Name = "button4";
    this.button4.Size = new System.Drawing.Size(112, 23);
    this.button4.TabIndex = 4;
    this.button4.Text = "button4";
    this.button4.Click += new System.EventHandler(this.button4_Click);
    //
    // button5
    //
    this.button5.Location = new System.Drawing.Point(216, 160);
    this.button5.Name = "button5";
    this.button5.Size = new System.Drawing.Size(112, 23);
    this.button5.TabIndex = 5;
    this.button5.Text = "button5";
    this.button5.Click += new System.EventHandler(this.button5_Click);
    //
    // button6
    //
    this.button6.Location = new System.Drawing.Point(216, 192);
    this.button6.Name = "button6";
    this.button6.Size = new System.Drawing.Size(112, 23);
    this.button6.TabIndex = 6;
    this.button6.Text = "button6";
    this.button6.Click += new System.EventHandler(this.button6_Click);
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    this.ClientSize = new System.Drawing.Size(360, 273);
    this.Controls.AddRange(new System.Windows.Forms.Control[] {
    this.button6,
    this.button5,
    this.button4,
    this.button3,
    this.button2,
    this.button1,
    this.listbox1});
    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    this.ResumeLayout(false);

    }
    #endregion

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

    Application.Run(new Form1());
    }

    private void button6_Click(object sender, System.EventArgs e)
    {
    //How to obtain list of files (example uses Windows folder).
    this.listbox1.Items.Clear();
    string[] files= Directory.GetFiles(winDir);
    foreach (string i in files)
    {
    addListItem(i);
    }
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
    //How to read a text file.
    //try...catch is to deal with a 0 byte file.
    this.listbox1.Items.Clear();
    StreamReader reader=new StreamReader(winDir + "\\system.ini");
    try
    {
    do
    {
    addListItem(reader.ReadLine());
    }
    while(reader.Peek() != -1);
    }

    catch
    {
    addListItem("File is empty");}

    finally
    {
    reader.Close();}


    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
    this.button1.Text = "Read Text File";
    this.button2.Text = "Write Text File";
    this.button3.Text = "View File Information";
    this.button4.Text = "List Drives";
    this.button5.Text = "List Subfolders";
    this.button6.Text = "List Files";
    }

    private void button5_Click(object sender, System.EventArgs e)
    {
    //How to get a list of folders (example uses Windows folder).
    this.listbox1.Items.Clear();
    string[] dirs = Directory.GetDirectories(winDir);
    foreach(string dir in dirs)
    {
    addListItem(dir);

    }
    }

    private void button4_Click(object sender, System.EventArgs e)
    {
    //Demonstrates how to obtain a list of disk drives.
    this.listbox1.Items.Clear();
    string[] drives = Directory.GetLogicalDrives();
    foreach(string drive in drives)
    {
    addListItem(drive);
    }
    }

    private void button3_Click(object sender, System.EventArgs e)
    {
    //How to retrieve file properties (example uses Notepad.exe).
    this.listbox1.Items.Clear();
    FileInfo FileProps =new FileInfo(winDir + "\\notepad.exe");
    addListItem("File Name = " + FileProps.FullName);
    addListItem("Creation Time = " + FileProps.CreationTime);
    addListItem("Last Access Time = " + FileProps.LastAccessTime);
    addListItem("Last Write TIme = " + FileProps.LastWriteTime);
    addListItem("Size = " + FileProps.Length);
    FileProps = null;
    }

    private void addListItem(string value)
    {
    this.listbox1.Items.Add(value);
    }

    private void button2_Click(object sender, System.EventArgs e)
    {
    //Demonstrates how to create and write to a text file.
    StreamWriter writer = new StreamWriter("c:\\KBTest.txt");
    writer.WriteLine("File created using StreamWriter class.");
    writer.Close();
    this.listbox1.Items.Clear();
    addListItem("File Written to C:\\KBTest.txt");
    }
    }
    }
  9. F5 キーを押してプログラムをビルドし、実行します。 ボタンをクリックして、動作の違いを確認します。 なお、サンプル コードを表示する際に、Windows フォーム デザイナーで生成されたコードの左側にあるマイナス記号 (-) をクリックしてこのコード部分を折りたたみ、アウトライン非表示にすることができます。