Visual C++ 2005 または Visual C++ .NET で基本的なファイル入出力を行う方法

文書翻訳 文書翻訳
文書番号: 307398 - 対象製品
この記事は、以前は次の ID で公開されていました: JP307398
Microsoft Visual C# .NET については、次の資料を参照してください。304430
Microsoft Visual Basic .NET については、次の資料を参照してください。304427

この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Microsoft Visual C++ 2005 または Microsoft Visual C++ .NET で 6 つの基本的なファイル入出力 (I/O) 操作を行う方法について、手順を追って説明します。.NET Framework を初めて使用する場合でも、.NET Framework におけるファイル操作用のオブジェクト モデルは、Microsoft Visual Studio 6.0 を使用する開発者の多くに馴染みのある FileSystemObject (FSO) に似ています。より簡単に理解できるように、この資料では、次の「サポート技術情報」 (Microsoft Knowledge Base) の資料を基にこの機能について説明します。
186118 Visual Basic で FileSystemObject を使用する方法
FileSystemObject は .NET Framework でも使用することができます。FileSystemObject はコンポーネント オブジェクト モデル (COM) コンポーネントであるため、.NET Framework は相互運用層経由でオブジェクトにアクセスする必要があります。このオブジェクトを使用する場合、.NET Framework によってコンポーネントのラッパーが生成されます。ただし、.NET Framework の File クラス、FileInfo クラス、Directory、DirectoryInfo クラス、および他の関連クラスは、FSO で使用できない機能を提供し、相互運用層のオーバーヘッドもありません。

必要条件

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

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

この資料の例では、基本的なファイル入出力操作について説明します。「サンプル プロジェクトの作成と実行」では、以下の 6 つのファイル入出力操作を説明するサンプル プログラムの作成方法を説明します。
  • テキスト ファイルの読み取り
  • テキスト ファイルへの書き込み
  • ファイル情報の表示
  • ディスク ドライブの一覧
  • フォルダの一覧
  • ファイルの一覧

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

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

}
				
: Visual C++ 2005 で上記のコードのコンパイルを正常終了するには、共通言語ランタイム サポート コンパイラ オプション (/clr:oldSyntax) を追加する必要があります。 共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順を実行します。
  1. [プロジェクト] メニューの [ProjectName のプロパティ] をクリックします。

    : ProjectName には、プロジェクトの名前が入ります。
  2. [構成プロパティ] を展開し、[全般] をクリックします。
  3. 右側のウィンドウで、[共通言語ランタイム サポート] プロジェクト設定の [共通言語ランタイム サポート、古い構文 (/clr:oldSyntax)] をクリックします。
  4. [適用] をクリックし、[OK] をクリックします。
共通言語ランタイム サポート コンパイラ オプションの詳細を参照するには、次の MSDN (Microsoft Developer Network) Web サイトをクリックしてください。
http://msdn2.microsoft.com/ja-jp/library/k8d11d4s.aspx

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

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

ファイル情報の表示

このサンプル コードでは、FileInfo クラスを使用して、ファイルのプロパティにアクセスします。このサンプルでは、Notepad.exe のプロパティにアクセスします。プロパティは ListBox コントロールに表示されます。
 listBox1->Items->Clear();
 String* testfile = String::Concat(windir, (S"\\notepad.exe")); 
 FileInfo *pFileProps  =new FileInfo(testfile);

 listBox1->Items->Add(String::Concat(S"File Name = ", (pFileProps->get_FullName() )) );
 listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime() ).ToString()) );
 listBox1->Items->Add(String::Concat(S"Last Access Time = "  ,(pFileProps->get_LastAccessTime() ).ToString()) );
 listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime() ).ToString()) );
 listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length() ).ToString()) );
				

ディスク ドライブの一覧

このサンプル コードでは、Directory および Drive クラスを使用して、システム上の論理ドライブの一覧を取得します。このサンプルでは、結果が ListBox コントロールに表示されます。
  listBox1->Items->Clear();
  String* drives[] = Directory::GetLogicalDrives();
  int numDrives = drives->get_Length();
  for (int i=0; i<numDrives; i++)
  {
	listBox1->Items->Add(drives[i]);
  } 
				

サブフォルダの一覧

このサンプル コードでは、Directory クラスの GetDirectories メソッドを使用して、フォルダの一覧を取得します。
listBox1->Items->Clear();
String* dirs[] = Directory::GetDirectories(windir);
int numDirs = dirs->get_Length();
for (int i=0; i<numDirs; i++)
{
listBox1->Items->Add(dirs[i]);
}
				

ファイルの一覧

このサンプル コードでは、Directory クラスの GetFiles メソッドを使用して、ファイルの一覧を取得します。
listBox1->Items->Clear();
String* files[]= Directory::GetFiles(this->windir);
int numFiles = files->get_Length();
for (int i=0; i<numFiles; i++)
{
  listBox1->Items->Add(files[i]);
}
				
ファイルの一覧を取得するときに、ファイルへのアクセスに失敗する場合があります。原因として考えられるのは、ファイルが存在しない、ファイルが使用中である、ユーザーがアクセスしようとするフォルダまたはファイルに対して権限がない、などです。コードを作成するときにこれらの可能性を考え、生成される例外の処理を考慮することが重要です。

手順例

  1. Microsoft Visual Studio .NET、Microsoft Visual Studio 2005、または Microsoft Visual C++ 2005 Express Edition を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [プロジェクトの種類] ボックスの一覧の [Visual C++ プロジェクト] をクリックし、[テンプレート] ボックスの一覧の [Windows フォーム アプリケーション (.NET)] をクリックします。

    : Visual Studio 2005 および Visual C++ 2005 Express Edition では、[プロジェクトの種類] ボックスの一覧の [Visual C++] をクリックします。[テンプレート] ボックスの一覧の [Windows フォーム アプリケーション] をクリックします。
  4. [プロジェクト名] ボックスに、Q307398 と入力し、[場所] ボックスに C:\ と入力して、[OK] をクリックします。
  5. デザイン ビューで Form1 フォームを開き、F4 キーを押して、[プロパティ] ウィンドウを開きます。
  6. [プロパティ] ウィンドウで、[Size] フォルダを展開します。[Width] ボックスに 700 と入力し、[Height] ボックスに 320 と入力します。
  7. ListBox コントロールを 1 つ、Button コントロールを 6 つ、Form1 に追加します。

    : ツールボックスを表示するには、[表示] メニューの [ツールボックス] をクリックします。
  8. [プロパティ] ウィンドウで、上記のコントロールの Location、(Name)、Size、TabIndex、および Text プロパティを、以下のように変更します。
    元に戻す全体を表示する
    Control ID Location (Name) Size TabIndex Text
    button1 500, 32 button1 112, 23 1 テキスト ファイルの読み取り
    button2 500, 64 button2 112, 23 2 テキスト ファイルへの書き込み
    button3 500, 96 button3 112, 23 3 ファイル情報の表示
    button4 500, 128 button4 112, 23 4 ドライブの一覧
    button5 500, 160 button5 112, 23 5 サブフォルダの一覧
    button6 500, 192 button6 112, 23 6 ファイルの一覧
    listBox1 24, 24 listBox1 450, 200 0 listBox1
  9. Form1.h ファイルを開きます。Form1 のクラスの宣言に、private の String 変数を以下のコードで宣言します。
    private:
    		String *windir;
  10. Form1 のクラスのコンストラクタに、次のコードを追加します。
    windir = System::Environment::GetEnvironmentVariable("windir");
  11. ファイル入出力操作を行うには、System.IO 名前空間を追加します
  12. Shift + F7 キーを押して、Form1 をデザイン ビュー開きます。[テキスト ファイルの読み取り] をダブルクリックして、次のコードを貼り付けます。

    : Visual C++ 2005 では、[表示] メニューの [デザイナ] をクリックします。
    // How to read a text file:
    // Use try...catch to deal with a 0 byte file or a non-existant file.
    listBox1->Items->Clear();
    
    try   
    {    
    	String* textFile = String::Concat(windir, (S"\\mytest.txt")); 
    	StreamReader *reader=new  StreamReader(textFile);
    	do
    	{
    	listBox1->Items->Add(reader->ReadLine());
    	}   
    	while(reader->Peek() != -1);
    }    
    catch(FileNotFoundException *ex)
    {
    	listBox1->Items->Add(ex);
    }  
            
    catch (System::Exception *e)
    { 
    	listBox1->Items->Add(e);
    }
  13. Form1 のデザイン ビューで、[テキスト ファイルへの書き込み] をダブルクリックして、次のコードを貼り付けます。
    // This demonstrates how to create and to write to a text file.
    StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt");
    pwriter->WriteLine(S"The file was created by using the StreamWriter class.");
    pwriter->Close();
    listBox1->Items->Clear();
    String *filew = new String(S"File written to C:\\KBTest.txt");
    listBox1->Items->Add(filew);
  14. Form1 のデザイン ビューで、[テキスト ファイルへの書き込み] をダブルクリックし、[ファイル情報の表示] をダブルクリックし、次のコードをメソッドに貼り付けます。
    // This code retrieves file properties. The example uses Notepad.exe.
    listBox1->Items->Clear();
    String* testfile = String::Concat(windir, (S"\\notepad.exe")); 
    FileInfo *pFileProps  =new FileInfo(testfile);
    
    listBox1->Items->Add(String::Concat(S"File Name = ", (pFileProps->get_FullName() )) );
    listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime() ).ToString()) );
    listBox1->Items->Add(String::Concat(S"Last Access Time = "  ,(pFileProps->get_LastAccessTime() ).ToString()) );
    listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime() ).ToString()) );
    listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length() ).ToString()) );
  15. Form1 のデザイン ビューで、[ファイル情報の表示] をダブルクリックして、次のコードを貼り付けます。
    // This demonstrates how to obtain a list of disk drives.
    listBox1->Items->Clear();
    String* drives[] = Directory::GetLogicalDrives();
    int numDrives = drives->get_Length();
    for (int i=0; i<numDrives; i++)
    {
    	listBox1->Items->Add(drives[i]);
    }
  16. Form1 のデザイン ビューで、[サブフォルダの一覧] ボタンをダブルクリックして、次のコードを貼り付けます。
    // This code obtains a list of folders. This example uses the Windows folder.
    listBox1->Items->Clear();
    String* dirs[] = Directory::GetDirectories(windir);
    int numDirs = dirs->get_Length();
    for (int i=0; i<numDirs; i++)
    {
    	listBox1->Items->Add(dirs[i]);                                                    
    }
  17. Form1 のデザイン ビューで、[ファイルの一覧] をダブルクリックして、次のコードを貼り付けます。
    // This code obtains a list of files. This example uses the Windows folder.
    listBox1->Items->Clear();
    String* files[]= Directory::GetFiles(this->windir);
    int numFiles = files->get_Length();
    for (int i=0; i<numFiles; i++)
    {
    	listBox1->Items->Add(files[i]);
    }
  18. プログラムをビルドして実行するには、Ctrl + F5 キーを押します。

完全なサンプル コード

: Visual C++ 2005 で実行する場合には、コードを変更する必要があります。
//Form1.h
#pragma once


namespace Q307398
{
	using namespace System;
	using namespace System::IO;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary> 
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you will need to change the 
	///          'Resource File Name' property for the managed resource compiler tool 
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public __gc class Form1 : public System::Windows::Forms::Form
	{
	private:
		String *windir;
	public:
		Form1(void)
		{
			windir = System::Environment::GetEnvironmentVariable("windir");
			InitializeComponent();
		}
  
	protected:
		void Dispose(Boolean disposing)
		{
			if (disposing && components)
			{
				components->Dispose();
			}
			__super::Dispose(disposing);
		}
	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;

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container * components;

		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			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 = System::Drawing::Point(500, 32);
			this->button1->Name = S"button1";
			this->button1->Size = System::Drawing::Size(112, 23);
			this->button1->TabIndex = 1;
			this->button1->Text = S"Read Text File";
			this->button1->Click += new System::EventHandler(this, button1_Click);
			// 
			// button2
			// 
			this->button2->Location = System::Drawing::Point(500, 64);
			this->button2->Name = S"button2";
			this->button2->Size = System::Drawing::Size(112, 23);
			this->button2->TabIndex = 2;
			this->button2->Text = S"Write Text File";
			this->button2->Click += new System::EventHandler(this, button2_Click);
			// 
			// button3
			// 
			this->button3->Location = System::Drawing::Point(500, 96);
			this->button3->Name = S"button3";
			this->button3->Size = System::Drawing::Size(112, 23);
			this->button3->TabIndex = 3;
			this->button3->Text = S"View File Information";
			this->button3->Click += new System::EventHandler(this, button3_Click);
			// 
			// button4
			// 
			this->button4->Location = System::Drawing::Point(500, 128);
			this->button4->Name = S"button4";
			this->button4->Size = System::Drawing::Size(112, 23);
			this->button4->TabIndex = 4;
			this->button4->Text = S"List Drives";
			this->button4->Click += new System::EventHandler(this, button4_Click);
			// 
			// button5
			// 
			this->button5->Location = System::Drawing::Point(500, 160);
			this->button5->Name = S"button5";
			this->button5->Size = System::Drawing::Size(112, 23);
			this->button5->TabIndex = 5;
			this->button5->Text = S"List Subfolders";
			this->button5->Click += new System::EventHandler(this, button5_Click);
			// 
			// button6
			// 
			this->button6->Location = System::Drawing::Point(500, 188);
			this->button6->Name = S"button6";
			this->button6->Size = System::Drawing::Size(112, 23);
			this->button6->TabIndex = 6;
			this->button6->Text = S"List Files";
			this->button6->Click += new System::EventHandler(this, button6_Click);
			// 
			// listBox1
			// 
			this->listBox1->Location = System::Drawing::Point(24, 24);
			this->listBox1->Name = S"listBox1";
			this->listBox1->Size = System::Drawing::Size(450, 199);
			this->listBox1->TabIndex = 0;
			// 
			// Form1
			// 
			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
			this->ClientSize = System::Drawing::Size(692, 293);
			this->Controls->Add(this->listBox1);
			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->Name = S"Form1";
			this->Text = S"Form1";
			this->ResumeLayout(false);

		}	
	private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
			 {// This code shows how to read a text file.
// The try...catch code is to deal with a 0 byte file or a non-existant file.
listBox1->Items->Clear();

				try   
				{    
					String* textFile = String::Concat(windir, (S"\\mytest.txt")); 
					StreamReader *reader=new  StreamReader(textFile);
					do
					{
					listBox1->Items->Add(reader->ReadLine());
					}   
					while(reader->Peek() != -1);
				} 
				catch(FileNotFoundException *ex)
				{
					listBox1->Items->Add(ex);
				}	     
				        
				catch (System::Exception *e)
				{ 
					listBox1->Items->Add(e);
				}
			 }

private: System::Void button2_Click(System::Object *  sender, System::EventArgs *  e)
		 {// This code demonstrates how to create and to write to a text file.
StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt");
pwriter->WriteLine(S"The file was created by using the StreamWriter class.");
pwriter->Close();
listBox1->Items->Clear();
String *filew = new String(S"The file was written to C:\\KBTest.txt");
listBox1->Items->Add(filew);
		 }

private: System::Void button3_Click(System::Object *  sender, System::EventArgs *  e)
		 {// This code retrieves file properties. This example uses Notepad.exe.
listBox1->Items->Clear();
String* testfile = String::Concat(windir, (S"\\notepad.exe")); 
FileInfo *pFileProps  =new FileInfo(testfile);

listBox1->Items->Add(String::Concat(S"File Name = ", (pFileProps->get_FullName() )) );
listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Last Access Time = "  ,(pFileProps->get_LastAccessTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length() ).ToString()) );
		 }

private: System::Void button4_Click(System::Object *  sender, System::EventArgs *  e)
		 {// The code demonstrates how to obtain a list of disk drives.
listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
	listBox1->Items->Add(drives[i]);
}
		 }

private: System::Void button5_Click(System::Object *  sender, System::EventArgs *  e)
		 {// This code obtains a list of folders. This example uses the Windows folder.
listBox1->Items->Clear();
String* dirs[] = Directory::GetDirectories(windir);
int numDirs = dirs->get_Length();
for (int i=0; i<numDirs; i++)
{
	listBox1->Items->Add(dirs[i]);                                                    
}
		 }

private: System::Void button6_Click(System::Object *  sender, System::EventArgs *  e)
		 {// This code obtains a list of files. This example uses the Windows folder.
listBox1->Items->Clear();
String* files[]= Directory::GetFiles(this->windir);
int numFiles = files->get_Length();
for (int i=0; i<numFiles; i++)
{
	listBox1->Items->Add(files[i]);
}
		 }

};
}

//Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>

using namespace Q307398;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
	Application::Run(new Form1());
	return 0;
}

関連情報

詳細については、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/default.aspx?xmlid=fh;EN-US;vcnet
Visual C++ .NET の詳細については、次の Microsoft Usenet ニュースグループを参照してください。
Visual C++ .NET 内のディスカッション
Visual C++ のマネージ拡張における Windows フォーム作成の詳細については、Visual Studio .NET のヘルプにあるサンプル "ManagedCWinFormWiz" を参照してください。

プロパティ

文書番号: 307398 - 最終更新日: 2007年8月31日 - リビジョン: 3.4
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
キーワード:?
kbhowtomaster kbwindowsforms kbio kbnewsgrouplink kbforms kbfileio KB307398
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com