Jak vytvořit funkce FileCompare pomocí Visual C++ .NET nebo Visual C++ 2005

Překlady článku Překlady článku
ID článku: 816189 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Tento podrobný článek popisuje porovnání dvou souborů naleznete, pokud jejich obsah jsou stejné. Tato porovnání vyhledá obsah dvou souborů, ale nepracuje na názvy souborů, umístění, data, časy nebo další atributy.

Tato funkce je podobná Fc.exe systém MS-DOS nástroj, který je součástí různých verzí Microsoft Windows a Microsoft MS-DOS a některé nástroje pro vývoj.

Ukázkový kód popsané v tomto článku provádí porovnání bajt po bajtu, dokud neshodu nalezen nebo dokud dosažen konec souboru. Kód také provádí následující dvě jednoduché kontroly zvýšit efektivitu porovnání:
  • Obě souboru bodu odkazy do stejného souboru musí být rovna dva soubory.
  • Pokud velikost dva soubory různých, dva soubory jsou různé.

Vytvoření ukázky

  1. Spusťte Microsoft Visual Studio 2005 nebo Visual Studio .NET (2003).
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. Projekty Visual C++ klepněte v části Typy projektu a v části šablony klepněte na příkaz Vysypat Project (.NET). Název projektu FileCompare.

    Poznámka: V aplikaci Visual Studio 2005 Visual C++ klepněte v části Typy projektu a klepněte na příkaz Vysypat projekt v části šablony.
  4. V aplikaci Solution Explorer klepněte pravým tlačítkem myši FileCompare, přejděte na příkaz Přidat a potom klepněte na možnost Přidat novou položku.
  5. V dialogovém okně Přidat novou položku v části šablony klepněte na Soubor záhlaví. V textovém poli název zadejte Form1 a potom klepněte na tlačítko Otevřít. Zobrazí se soubor 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)
    		{	 
    		}
    
    	};
    }
    Tento kód vytvoří formulář obsahující dva ovládací prvky textové pole a příkazové tlačítko.

    Poznámka: Je nutné přidat možnost kompilátoru podporu runtime běžné jazyk (/ clr:oldSyntax) v Visual C++ 2005 úspěšně zkompilovat předchozí ukázkový kód. Přidat běžné podporu kompilátor možnost runtime jazyka Visual C++ 2005, postupujte takto:
    1. Klepněte na tlačítko projekt a klepněte na tlačítko <ProjectName> Vlastnosti.

      Poznámka:<ProjectName> je zástupný název projektu.
    2. Rozbalte položku Konfigurace vlastnosti a potom klepněte na položku Obecné.
    3. Klepnutím vyberte Common Language Runtime podpory, staré syntaxe (/ clr:oldSyntax) v podporují Common Language Runtime projektu nastavení v pravém podokně, klepněte na tlačítko použít a potom klepněte na tlačítko OK.
    Další informace o společného jazykového modulu runtime podporují možnost kompilátoru naleznete na následujícím webu:
    / clr (Common Language Runtime kompilace)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Přidání třídy Form1 následující funkci:
    // 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. Vložte následující kód v události Click příkazového tlačítka button1_Click ve třídě Form1:
    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. V aplikaci Solution Explorer klepněte pravým tlačítkem myši FileCompare, přejděte na příkaz Přidat a potom klepněte na možnost Přidat novou položku.
  10. V dialogovém okně Přidat novou položku v části šablony klepněte na Soubor C++. V textovém poli název zadejte File_Compare a potom klepněte na tlačítko Otevřít. Zobrazí se soubor File_Compare.cpp.
  11. Vložte následující kód v file:
    #include "form1.h"
    
    #include <windows.h>
    #include <tchar.h>
    
    using namespace Compare;
  12. Přidejte následující funkce WinMain souboru File_Compare.cpp:
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    }
  13. Vložte následující kód ve funkci WinMain:
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. Uložit ukázkové.

Spuštění ukázky

  1. Dodat úplné cesty k dva soubory ovládací prvky textové pole.
  2. Klepněte na tlačítko Porovnat.

Odkazy

Další informace navštivte následující webové servery Microsoft Developer Network (MSDN):
System.IO Namespace
Soubor Access prostřednictvím FileStream třídy

Vlastnosti

ID článku: 816189 - Poslední aktualizace: 26. listopadu 2007 - Revize: 2.3
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Klíčová slova: 
kbmt kbhowtomaster kbhowto kbio KB816189 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:816189

Dejte nám zpětnou vazbu

 

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