Visual C++ .NET または Visual C++ 2005 を使用して、FileCompare 関数を作成する方法

文書翻訳 文書翻訳
文書番号: 816189 - 対象製品
すべて展開する | すべて折りたたむ

概要

このステップ バイ ステップ方法について説明を 2 つのファイルの内容が同じかどうかを比較します。 この比較は、2 つのファイルの内容を調べ、ファイル名、場所、日付、時刻、またはその他の属性ではなくは。

この機能は、- MS-DOS ベースの Fc.exe に似ていますが各種のバージョンの Microsoft Windows と Microsoft MS-DOS、およびいくつか開発ツールに含まれているユーティリティです。

この資料に記載されているサンプル コードは、ファイルの終わりに達するまで、または不一致が検出されるまで、バイトずつ比較します。 このコードは次の 2 つの比較の効率性を強化するの単純なチェックも実行します。
  • 同じファイルに参照ポイント両方場合で、2 つのファイルでなければなりません。
  • 場合は、2 つのサイズ別ファイル、2 ファイルは別です。

サンプルの作成

  1. Visual Studio .NET (2003) または Microsoft Visual Studio 2005 を起動します。
  2. [ ファイル ] メニューの [ 新規作成 ] をポイントし、[ プロジェクト ] をクリックします。
  3. [ プロジェクトの種類 ] で [ Visual C++ プロジェクト をクリックし、 空プロジェクト (.NET) [ テンプレート ] ボックスの一覧の [。 プロジェクトの名前 FileCompare

    メモ [Visual Studio 2005 で Visual C++ プロジェクトの種類 ] の [を [ テンプレート ] ボックスの一覧の [ 空のプロジェクト をクリックします。
  4. ソリューション エクスプローラーで、 FileCompare を右クリックして 追加 ] をポイントし、[ 新しい項目の追加 ] をクリックします。
  5. [新しい項目の追加 ] ダイアログします ヘッダー ファイル の [ テンプレート ] ボックスの一覧の [。 [ 名前 ] テキスト Form1 ] を入力し、[ ファイルを開く しています。 Form1.h ファイルが表示されます。
  6. Paste the following code in the Form1.h file:
    #pragma once
    #using <mscorlib.dll>
    #using <system.windows.forms.dll>
    #using <system.dll>
    #using <system.drawing.dll>
    
    namespace Compare
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Drawing;
    	using namespace System::IO;
    
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    		}
      
    	protected:
    		void Dispose(Boolean disposing)
    		{
    			if (disposing && components)
    			{
    				components->Dispose();
    			}
    			__super::Dispose(disposing);
    		}
    	
    	private: System::Windows::Forms::TextBox *  textBox1;
    	private: System::Windows::Forms::TextBox *  textBox2;
    	private: System::Windows::Forms::Label *  label1;
    	private: System::Windows::Forms::Label *  label2;
    	private: System::Windows::Forms::Button *  Compare;
    
    
    	private:
    
    		System::ComponentModel::Container * components;
    
    		
    		void InitializeComponent(void)
    		{
    			this->textBox1 = new System::Windows::Forms::TextBox();
    			this->textBox2 = new System::Windows::Forms::TextBox();
    			this->label1 = new System::Windows::Forms::Label();
    			this->label2 = new System::Windows::Forms::Label();
    			this->Compare = new System::Windows::Forms::Button();
    			this->SuspendLayout();
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(32, 104);
    			this->textBox1->Name = S"textBox1";
    			this->textBox1->TabIndex = 0;
    			this->textBox1->Text = S"";
    			// 
    			// textBox2
    			// 
    			this->textBox2->Location = System::Drawing::Point(168, 104);
    			this->textBox2->Name = S"textBox2";
    			this->textBox2->TabIndex = 1;
    			this->textBox2->Text = S"";
    			// 
    			// label1
    			// 
    			this->label1->Location = System::Drawing::Point(32, 64);
    			this->label1->Name = S"label1";
    			this->label1->TabIndex = 2;
    			this->label1->Text = S"File1";
    			// 
    			// label2
    			// 
    			this->label2->Location = System::Drawing::Point(176, 64);
    			this->label2->Name = S"label2";
    			this->label2->TabIndex = 3;
    			this->label2->Text = S"File2";
    			// 
    			// Compare
    			// 
    			this->Compare->Location = System::Drawing::Point(96, 168);
    			this->Compare->Name = S"Compare";
    			this->Compare->TabIndex = 4;
    			this->Compare->Text = S"Compare";
    			this->Compare->Click += new System::EventHandler(this, button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
    			this->ClientSize = System::Drawing::Size(292, 273);
    			this->Controls->Add(this->Compare);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->textBox2);
    			this->Controls->Add(this->textBox1);
    			this->Name = S"Form1";
    			this->Text = S"Form1";
    			this->ResumeLayout(false);
    
    		}
    	private:
    		System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    		{	 
    		}
    
    	};
    }
    このコードは 2 つのテキスト ボックス コントロールとコマンド ボタンを含むフォームを作成します。

    メモ 共通言語ランタイム サポート コンパイラ オプションを追加する (または clr:oldSyntax) 正常に上記のコード サンプルをコンパイルする Visual C++ 2005 で。 追加する、共通言語ランタイム サポート コンパイラ オプション Visual C++ 2005 には、次の手順に従います。
    1. プロジェクト ] をクリックして [<ProjectName> プロパティ

      メモ <ProjectName> は、プロジェクトの名前のプレースホルダーです。
    2. [構成プロパティ ] を展開し、[ 全般 しています。
    3. [印刷] をクリック 共通言語ランタイム サポート、古い構文 (または clr:oldSyntax) 共通言語ランタイム サポート のプロジェクト設定右側のウィンドウで [で [ 適用 ] をクリックを [OK] をクリックします。
    共通言語ランタイムの詳細についてサポート コンパイラ オプションは、次のマイクロソフト Web サイトを参照してください。
    /clr (共通言語ランタイムのコンパイル)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Form1 クラスに次の関数を追加:
    // This method accepts two strings that represent two files to 
    // compare. A return value of 0 indicates that the contents of the files
    // are the same. A return value of any other value indicates that the 
    // files are different.
    private:
    bool FileCompare(String *file1, String *file2)
    {
    	int file1byte;
    	int file2byte;
    	FileStream *fs1;
    	FileStream *fs2;
        
    	// Determine if the same file was referenced two times.
    	if (String::Equals(file1,file2))
    	{
    		// Return true to indicate that the files are the same.
    		return true;
    	}
    
            
    	// Open the two files.
    	try
    	{
    		fs1 = new FileStream(file1, FileMode::Open);
    		fs2 = new FileStream(file2, FileMode::Open);
    	
    			    
    		// Check the file sizes. If the sizes are different, the files 
    		// are different.
    		if (fs1->Length != fs2->Length)
    		{
    			// Close the file
    			fs1->Close();
    			fs2->Close();
    
    			// Return false to indicate files are different
    			return false;
    		}
    
    		// Read and compare a byte from each file until either a
    		// non-matching set of bytes is found or until the end of
    		// file1 is reached.
    		do 
    		{
    			// Read one byte from each file.
    			file1byte = fs1->ReadByte();
    			file2byte = fs2->ReadByte();
    		}
    		while ((file1byte == file2byte) && (file1byte != -1));
    
    		// Close the files.
    		fs1->Close();
    		fs2->Close();
    	}
    	
    	catch(Exception *ex)
    	{
    		if(fs1)
    		{
    			fs1->Close();
    		}
    		if(fs2)
    		{
    			fs2->Close();
    		}
    		throw ex;
    	}
    
    	// Return the success of the comparison. "file1byte" is 
    	// equal to "file2byte" at this point only if the files are 
    	// the same.
    	return ((file1byte - file2byte) == 0);
    }
    
    
  8. Form1 クラスに button1_Click コマンド ボタンに、 クリックして イベントに次のコードを貼り付けます:
    try
    {
    	if (FileCompare(this->textBox1->Text, this->textBox2->Text))
    	{
    		MessageBox::Show("Files are equal.");				
    	}
    	else
    	{
    		MessageBox::Show("Files are not equal.");
    	}
    }
    catch(Exception *ex)
    {
    	MessageBox::Show(ex->Message);
    }
    
  9. ソリューション エクスプローラーで、 FileCompare を右クリックして 追加 ] をポイントし、[ 新しい項目の追加 ] をクリックします。
  10. [新しい項目の追加 ] ダイアログします C++ ファイル [ テンプレート ] ボックスの一覧の [。 [ 名前 ] テキスト File_Compare を入力し、[ ファイルを開く しています。 File_Compare.cpp ファイルが表示されます。
  11. 次のコードを貼り付け、File_Compare.cpp file:
    #include "form1.h"
    
    #include <windows.h>
    #include <tchar.h>
    
    using namespace Compare;
  12. 次の WinMain 関数は、File_Compare.cpp ファイルに追加:
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    }
  13. 次のコード WinMain 関数に貼り付けます:
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. このサンプルを保存します。

サンプルを実行します。

  1. テキスト ボックス コントロール内の 2 つのファイルへの完全なパスを指定します。
  2. [ 比較 ] をクリックします。

関連情報

詳細については、次のマイクロソフトの開発者用ネットワーク (MSDN) の Web サイトを参照してください。
System.IO 名前空間
ファイル アクセス、FileStream クラスを使用

プロパティ

文書番号: 816189 - 最終更新日: 2007年11月26日 - リビジョン: 2.3
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
キーワード:?
kbhowto kbhowtomaster kbio kbmt KB816189 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:816189
Microsoft Knowledge Base の免責: 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