Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнение файлов 
:(
    Опции темы
PIF
Дата 28.4.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Здравствуйте! Скажите пожалуйста, как мне реализовать сравнение двух текстовых файлов по содержанию, и если в них есть отличае вывести ошибку
Заранее благодарен!!!
PM MAIL   Вверх
Ch0bits
Дата 28.4.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Смотри Delphi FAQ
Взято оттуда:

Код

function FilesAreEqual(const File1, File2: TFileName): Boolean;  
const    
  BlockSize = 65536;  
var    
  fs1, fs2: TFileStream;    
  L1, L2: Integer;    
  B1, B2: array[1..BlockSize] of Byte;  
begin    
  Result := False;    
  fs1 := TFileStream.Create(File1, fmOpenRead or fmShareDenyWrite);  
  try      
    fs2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyWrite);  
    try        
      if fs1.Size = fs2.Size then   
      begin          
        while fs1.Position < fs1.Size do   
        begin            
          L1 := fs1.Read(B1[1], BlockSize);  
          L2 := fs2.Read(B2[1], BlockSize);  
          if L1 <> L2 then   
          begin              
            Exit;  
          end;            
          if not CompareMem(@B1[1], @B2[1], L1) then Exit;          
        end;          
        Result := True;        
      end;      
    finally        
      fs2.Free;      
    end;    
  finally      
    fs1.Free;    
  end;  
end;


ИЛИ

Код

function CompareFiles(Filename1,FileName2:string):longint; 
{ 
  Сравнение файлов 

  возвращает номер несовпадающего байта, 
  (байты отсчитываются с 1)или: 
  0 - не найдено отличий, 
  -1 - ошибка файла 1 
  -2 - ошибка файла 2 
  -3 - другие ошибки 
} 
const 
  Buf_Size=16384; 
var 
  F1,F2:TFileStream; 
  i:longint; 
  Buff1,Buff2:PByteArray; 
  BytesRead1,BytesRead2:integer; 
begin 
  Result:=0; 
  try 
    F1:=TFileStream.Create(FileName1,fmShareDenyNone); 
  except 
    Result:=-1; 
    exit; 
  end; 
  try 
    F2:=TFileStream.Create(FileName2,fmShareDenyNone); 
  except 
    Result:=-2; 
    F1.Free; 
    exit; 
  end; 
  GetMem(Buff1,Buf_Size); 
  GetMem(Buff2,Buf_Size); 
  try 
    if F1.Size> F2.Size then Result:=F2.Size+1 
    else if F1.SizeF1.Position) and (Result=0) do begin 
      BytesRead1 :=F1.Read(Buff1^,Buf_Size); 
      BytesRead2 :=F2.Read(Buff2^,Buf_Size); 
      if (BytesRead1=BytesRead2) then begin 
        for i:= 0 to BytesRead1-1 do begin 
          if Buff1^[i]< > Buff2^[i] 
          then begin 
            result:=F1.Position-BytesRead1+i+1; 
            break; 
          end; 
        end; 
      end else begin 
        Result:=-3; 
        break; 
      end; 
    end; 
  end; 
  except 
    Result:=-3; 
  end; 
  F1.Free; 
  F2.Free; 
  FreeMem(Buff1,Buf_Size); 
  FreeMem(Buff2,Buf_Size); 
end; 


PM WWW   Вверх
PIF
Дата 28.4.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Спасибо!
PM MAIL   Вверх
Yanis
Дата 28.4.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Если нужно только сравнить и выяснить разные файлы или нет, то можно посчитать CRC.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 29.4.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(PIF @ 28.4.2005, 22:08)
как мне реализовать сравнение двух текстовых файлов
Если участь, что будут сравниваться ТОЛЬКО текстовые файлы, то вот вариант.
Код
function TextFileEquals (File1, File2: string):boolean;
var
f1,f2: TextFile;
Text1,Text2: string;
begin
AssignFile(f1,File1);
AssignFile(f2,File2);

Reset(f1);
Reset(f2);

Read(f1,Text1);
Read(f2,Text2);

CloseFile(f1);
CloseFile(f2);

If Text1 = Text2 then Result:= True else Result:= False;

end;




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Dr.No_xXx
Дата 29.4.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 24.2.2005

Репутация: нет
Всего: нет



Цитата
Если участь, что будут сравниваться ТОЛЬКО текстовые файлы, то вот вариант.

И написаны будут одинаково со всеми пробелами и т.п.
PM MAIL   Вверх
Ch0bits
Дата 29.4.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Poseidon
Твой код сравнивает только одну строку из файлов.
Ты ни про какие циклы не забыл?

По моему это должно выглядеть так:
Код

function TextFileEquals (File1, File2: string):boolean;
var
  f1,f2:TextFile;
  Text1,Text2:string;
begin
  result:=true;
  AssignFile(f1,File1);
  AssignFile(f2,File2);
  Reset(f1);
  Reset(f2);
  if FileSize(f1)<>FileSize(f2) then begin
    Result:=False;
    exit;
  end;
  while not(Eof(f1)) do begin
    Readln(f1,Text1);
    Readln(f2,Text2);
    if Text1<>Text2 then begin
       Result:=False;
       break;
    end;
  end;
  CloseFile(f2);
  CloseFile(f1);
end;


Это сообщение отредактировал(а) Vadim999 - 29.4.2005, 14:17
PM WWW   Вверх
Poseidon
Дата 29.4.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



О, голова моя пустая smile Точно! Забыл! Исправляюсь
Код
function TextFileEquals (File1, File2: string):boolean;
var
f1,f2: TextFile;
Text1,Text2: string;
buf: string;
begin
AssignFile(f1,File1);
AssignFile(f2,File2);

Reset(f1);
Reset(f2);

while not EOF(f1)do
  begin
  readln(f1, buf);
  Text1:= Text1+buf+#13;// #13 для пущей достоверности, хотя для сравнения не обязателно
  end;

while not EOF(f2)do
  begin
  readln(f2, buf);
  Text2:= Text2+buf+#13;// #13 для пущей достоверности, хотя для сравнения не обязателно
  end;

CloseFile(f1);
CloseFile(f2);

If Text1 = Text2 then Result:= True else Result:= False;

end;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Ch0bits
Дата 29.4.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



Да у нас тут теперь целая библиотека сравнений. smile Выбирай-нехочу!

О... у меня ошибка, если число строк в файлах разное, то цикл слетит, надо защитить:
Код

try
  while not(Eof(f1)) do begin
      Readln(f1,Text1);
      Readln(f2,Text2);
      if Text1<>Text2 then begin
         Result:=False;
         break;
      end;
  end;
except
  Result:=False;
end;


А у Вас, Poseidon, Text1 & Text2 могут переполниться.

Это сообщение отредактировал(а) Vadim999 - 29.4.2005, 17:20
PM WWW   Вверх
alien2285
Дата 4.9.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.8.2007
Где: Ташкент

Репутация: нет
Всего: нет



а если файл не Текстовый, а экзешный, и нужно сравнить размеры и дату создания, и если расходятся выводить сообщение...

плюс находятся на разных машинах (в локальной сети)

Это сообщение отредактировал(а) alien2285 - 4.9.2007, 12:39
PM MAIL ICQ Skype   Вверх
Poseidon
Дата 5.9.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Дату файла можно узнать с помощью FileAge и FileDateToDateTime:

Код
function GetFileDateTime(FileName: string): TDateTime;
var
  intFileAge: LongInt;
begin
  intFileAge := FileAge(FileName);
  if intFileAge = -1 then
    Result := 0
  else
    Result := FileDateToDateTime(intFileAge)
end;


размер файла - с помощью FileSize или типа TSearchReс


А еще ты никрофил smile




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
alien2285
Дата 6.9.2007, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.8.2007
Где: Ташкент

Репутация: нет
Всего: нет



спсб за совет.. smile)

 smile) эт ессли из за того, что я начал дрючить старую тему, которую давно забыли и считают мёртвую, то лучше так чем потом выслушивать от админов что мол типа такая тема есть и т д и т.п. к тому же она не закрыта, а значит ещё жива, это скорее всего совращение старушки, чем никрофилия.. smile)))
PM MAIL ICQ Skype   Вверх
Apls
Дата 10.9.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Yanis, а какая функция есть в delphi7 для подсчета CRC суммы файла?
PM MAIL   Вверх
ne0n
Дата 10.9.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 1
Всего: 11



Цитата(Apls @  10.9.2007,  16:08 Найти цитируемый пост)
Yanis, а какая функция есть в delphi7 для подсчета CRC суммы файла?

smile  хых...никаких не существует...нужно самому писать, правдо до тебя уже все сделали, либо в поиск по форуму либо по гуглу  smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 10.9.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ne0n @  10.9.2007,  16:17 Найти цитируемый пост)
хых...никаких не существует...нужно самому писать, правдо до тебя уже все сделали, либо в поиск по форуму либо по гуглу

  Фрешь smile

Есть целый класс TIdHashCRC32 в модуле IdHashCRC.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.