Инструкции по созданию FileCompare функции с помощью Visual C++ .NET или Visual C++ 2005

Переводы статьи Переводы статьи
Код статьи: 816189 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

В данной статье описывается сравнение двух файлов, чтобы увидеть, если их содержимое совпадают. Это сравнение просматривает содержимое двух файлов, но не не на имена файлов, расположение, даты, времени или других атрибутов.

Эта функция подобна FC.exe основе ПРИЛОЖЕНИЙ ЗАПУСКОМ служебной программы, поставляемой с различными версиями Microsoft Windows и Microsoft MS-DOS и некоторые средства разработки.

Пример кода, описанного в этой статье выполняет сравнение байт за байтом, пока не будет обнаружено несоответствие или пока не будет достигнут конец файла. Этот код также выполняет две следующие простые проверки для повышения эффективности сравнения:
  • Если оба файла точки ссылки в тот же файл, должно быть равно двух файлов.
  • Если размер двух файлов в другой, два файла различны.

Создание образца

  1. Запустите Visual Studio .NET (2003) или Microsoft Visual Studio 2005.
  2. в менюФайл:Выберите пункт менюСОЗДАТЬ.и выберите командуProject.
  3. затем –Проекты Visual C++Из спискаТипы проектови выберите командуПустой проект (.NET)Из спискаШаблоны:. Имя проектаFileCompare.

    Примечание.В Visual Studio 2005 щелкнитеВ Visual C++Из спискаТипы проектови выберите командуПустой проектИз спискаШаблоны:.
  4. В обозревателе решений щелкните правой кнопкой мышиFileCompare, выберите пунктДобавьте сервери выберите командуДобавление нового элемента.
  5. В диалоговом окнеДобавление нового элементадиалоговое окно, нажмите кнопкуФайл заголовкаИз спискаШаблоны:. В диалоговом окнеИМЯтекстовое поле, типФормы Form1и выберите командуOPEN. Откроется файл Form1.h.
  6. Вставьте следующий код в файле Form1.h:
    #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)
    		{	 
    		}
    
    	};
    }
    В этом коде создается форма, содержащая два текстовых поля и кнопки.

    Примечание.Необходимо добавить параметр компилятора поддержки общего языка во время выполнения (/ CLR: oldSyntax) в Visual C++ 2005 для успешной компиляции предыдущего примера кода. Чтобы добавить параметр компилятора поддержки общего языка во время выполнения в Visual C++ 2005, выполните следующие действия.
    1. затем –Projectи выберите команду<projectname></projectname>Свойства.

      Примечание.<projectname></projectname>— Это имя проекта.
    2. expandСвойства конфигурациии выберите командуОбщие.
    3. Выберите вариантОбщей языковой среды выполнения поддержки, старый синтаксис (/ CLR: oldSyntax)В диалоговом окнеПоддержка общей языковой среды выполненияпроект настройки на правой панели, нажмите кнопкуПрименениеи выберите командуOk..
    Для получения дополнительных сведений о общеязыковая среда выполнения поддерживает параметр компилятора, посетите следующий веб-узел корпорации Майкрософт:
    / 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. Вставьте следующий код взатем –событияButton1_Clickкнопки вФормы 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. В обозревателе решений щелкните правой кнопкой мышиFileCompare, выберите пунктДобавьте сервери выберите командуДобавление нового элемента.
  10. В диалоговом окнеДобавление нового элементадиалоговое окно, нажмите кнопкуФайл C++Из спискаШаблоны:. В диалоговом окнеИМЯтекстовое поле, типFile_Compareи выберите командуOPEN. Откроется файл File_Compare.cpp.
  11. Вставьте следующий код в файле File_Compare.cpp:
    #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. Вставьте следующий код вWinMainfunction::
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. Сохраните образец.

Запуск образца

  1. Укажите полные пути для двух файлов текстовых полей.
  2. затем –Сравнение.

Ссылки

Для получения дополнительных сведений посетите следующие веб-страницы узла MSDN::
Пространство имен System.IO
Доступ К файлам через класс FileStream

Свойства

Код статьи: 816189 - Последний отзыв: 25 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Ключевые слова: 
kbhowtomaster kbhowto kbio kbmt KB816189 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:816189

Отправить отзыв

 

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