Wie Sie eine FileCompare-Funktion erstellen, indem mithilfe von Visual C++ .NET oder Visual C++ 2005

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 816189 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Dieser in einzelne Schritte gegliederte Artikel beschreibt das Vergleichen von zwei Dateien, ob Ihr Inhalt identisch sind. Dieser Vergleich untersucht den Inhalt zweier Dateien, aber nicht zu den Dateinamen, Speicherorten, Datumsangaben, Zeiten, oder andere Attribute hat.

Diese Funktionalität ist vergleichbar mit der MS-DOS-basierten Fc.exe Dienstprogramm, das mit verschiedenen Versionen von Microsoft Windows und Microsoft MS-DOS und einigen Entwicklungstools enthalten ist.

Der Beispielcode, der in diesem Artikel beschriebene führt einen Byte für Byte-Vergleich, bis eine fehlende Übereinstimmung gefunden wird oder bis das Ende der Datei erreicht ist. Der Code führt außerdem die folgenden zwei einfachen Prüfungen die Effizienz des Vergleichs aus:
  • Wenn beide auf dieselbe Datei Verweise auf Datei, müssen die beiden Dateien gleich sein.
  • Wenn die Größe der beiden anderen Dateien, sind die zwei Dateien unterschiedlich.

Erstellen des Beispiels

  1. Starten Sie Visual Studio .NET (2003) oder Microsoft Visual Studio 2005.
  2. Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt .
  3. Klicken Sie unter Projekttypen auf Visual C++-Projekte , und klicken Sie dann unter Vorlagen auf Leeres Projekt (.NET) . Nennen Sie das Projekt FileCompare .

    Hinweis: Klicken Sie in Visual Studio 2005 unter Projekttypen auf Visual C++ , und klicken Sie dann Leere unter Vorlagen auf.
  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf FileCompare , zeigen Sie auf Hinzufügen und klicken Sie dann auf Neues Element hinzufügen .
  5. Klicken Sie im Dialogfeld Neues Element hinzufügen unter Vorlagen auf Headerdatei . Geben Sie in das Textfeld Name Form1 und klicken Sie dann auf Öffnen . Die Datei Form1.h wird angezeigt.
  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)
    		{	 
    		}
    
    	};
    }
    dieser Code erstellt ein Formular, das zwei Textfeld-Steuerelemente und eine Befehlsschaltfläche enthält.

    Hinweis: Müssen Sie die common Language Common Language Runtime Unterstützung Compiler-Option (/ CLR: oldSyntax) in Visual C++ 2005 um das vorherige Codebeispiel erfolgreich zu kompilieren. Gehen Sie folgendermaßen vor um die common Language Common Language Runtime Unterstützung-Compileroption in Visual C++ 2005 hinzuzufügen:
    1. Klicken Sie auf Projekt und dann auf <ProjectName> Eigenschaften .

      Hinweis: <ProjectName> ist ein Platzhalter für den Namen des Projekts.
    2. Erweitern Sie Konfiguration , und klicken Sie dann auf Allgemein .
    3. Klicken Sie auf Common Language Runtime-Unterstützung, alte Syntax (/ CLR: oldSyntax) in der Common Language Runtime-Unterstützung Projekt Einstellung im rechten Fensterbereich klicken Sie auf Übernehmen und klicken Sie dann auf OK .
    Weitere Informationen über die common Language Runtime unterstützt Compileroption, besuchen Sie die folgenden Microsoft-Website:
    / Clr (Common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Fügen Sie der Klasse Form1 die folgende Funktion:
    // 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. Fügen Sie folgenden Code im Click -Ereignis der Befehlsschaltfläche Button1_Click in der Klasse 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. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf FileCompare , zeigen Sie auf Hinzufügen und klicken Sie dann auf Neues Element hinzufügen .
  10. Klicken Sie im Dialogfeld Neues Element hinzufügen unter Vorlagen auf C++-Datei . Geben Sie in das Textfeld Name File_Compare und klicken Sie dann auf Öffnen . Die Datei File_Compare.cpp wird angezeigt.
  11. Fügen Sie folgenden Code in der File_Compare.cpp-file:
    #include "form1.h"
    
    #include <windows.h>
    #include <tchar.h>
    
    using namespace Compare;
  12. Fügen Sie die folgende WinMain -Funktion in die Datei File_Compare.cpp:
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    }
  13. Fügen Sie den folgenden Code in der WinMain -Funktion:
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. Speichern Sie das Beispiel.

Ausführen des Beispiels

  1. Geben Sie vollständige Pfade zu zwei Dateien in das Textfeld-Steuerelementen.
  2. Klicken Sie auf Vergleichen .

Informationsquellen

Informationen finden Sie auf den folgenden Websites von Microsoft Developer Network (MSDN):
System.IO-Namespace
Dateizugriff mit der FileStream-Klasse

Eigenschaften

Artikel-ID: 816189 - Geändert am: Montag, 26. November 2007 - Version: 2.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Keywords: 
kbmt kbhowtomaster kbhowto kbio KB816189 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 816189
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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