Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение файлов на winapi и поиск различий [D1, D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]


g-l-u-k ©   (2004-07-27 01:56:00) 

Уважаеммые мастера,меня к вам такой вопрос,можноли при помощи winapi сравнить два файла,а затем вывести лог о сходствах и различиях данных файлов.Если можно киньте исходник или ссылку.
Зарание благодарен.


Piter   (2004-07-27 15:28:00) [1]

g-l-u-k   (27.07.04 11:40) [4]

ну приплыли...
Молодой человек, а почему бы вам сразу не сказать - "Народ, напишите мне программу, которая делает то то".

Была бы куда правдивее...


g-l-u-k   (2004-07-27 11:40:00) [2]

Ещё один вопрос,как после всего этого вывести лог-файл?


Игорь Шевченко   (2004-07-27 11:07:00) [3]


> Про такую Api функцию не слышал, но я не исключаю ее существование.


Функции, разумеется, нету. Но никто не мешает использовать готовую программу, вроде WinDiff - там алгоритм несколько посложнее, чем в [2]


Кириешки   (2004-07-27 08:52:00) [4]

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;


Ertong   (2004-07-27 07:23:00) [5]

Файл1:
1234567890

Файл2:
123457890

Если ты должен определить в этих файлах одно отличие(удаление символа) то ты попал :), а если 5, то я думаю это не сложно реализовать.

Если ты все таки попал, то используй динамическое программирование.
Да, и тебе понадобися n*m памяти (n,m - это размеры двух файлов).

Про такую Api функцию не слышал, но я не исключаю ее существование.


Наверх

Титульная страница Поиск, карта сайта Написать письмо