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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск всех одинаковых файлов на диске 
:(
    Опции темы
NetDigger
Дата 17.11.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!

И еще раз озадачу: нужно сделать процедуру, которая бы на входе имела имя логического диска (или подпапки) и искала на них одинаковые файлы (имя, размер, дата). Конечно, и бинарное сравнение возможно реализовать если будет не слишком громоздко и долгодумающе. Брать FindFirst, FindNext, FindClose и вперед? Как тогда проводить сравнение - брать первый попавшийся файл и по всем папкам его искать, затем следующий и так до второго пришествия? Это хорошо, когда файлов на диске 100, а если их 60000? Или я ошибаюсь?

PM MAIL   Вверх
p0s0l
Дата 18.11.2004, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Обходи все файлы FindFirst .. FindNext...
При этом инфу о каждом файле заноси в массив.
И при занесении в массив ищи, есть ли уже в массиве такой файл...
Если есть, то это двойники. Можно сравнить по содержимому...


--------------------
С уважением, г-н Посол.
PM   Вверх
dm9
Дата 18.11.2004, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Если ручками массив делать - будет долго... Тут бы базу данных использовать, где способы увеличения скорости уже продуманы smile Проходишь по дереву, выполняешь запрос, добавляешь файл, потом следующий файл... Или, может быть, добавить файлы, потом запросом вычленить нужные тебе.
Но это я чисто теоретически философствую - сам не силён в базах данных. Однако, редсказаваю, что при 10000 файлов с использованием обычного массива тормозить будет жутко smile
PM MAIL ICQ   Вверх
SlaUr
Дата 18.11.2004, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



используйте модули Mysys.tpu ,Mystr.tpu
(mystr только для cNFi)


Сначала создаем листы всех файлов на дисках

Код

var List1,list2:tstringlist;

List1:=Tstringlist.Create;
List2:=TstringList.Create;

SearchInDir('*.*','C:\',True,List1);
SearchInDir('*.*','D:\',True,List2);

Сейчас у нас В List1 и List2 конкретные пути к файлам.

Вычисляем контрольные суммы файлов
Код

function GetCheckSum(FileName: string): DWORD;
var
 F: file of DWORD;
 P: Pointer;
 Fsize: DWORD;
 Buffer: array [0..500] of DWORD;
begin
 FileMode := 0;
 AssignFile(F, FileName);
 Reset(F);
 Seek(F, FileSize(F) div 2);
 Fsize := FileSize(F) - 1 - FilePos(F);
 if Fsize > 500 then Fsize := 500;
 BlockRead(F, Buffer, Fsize);
 Close(F);
 P := @Buffer;
 asm
    xor eax, eax
    xor ecx, ecx
    mov edi , p
    @again:
      add eax, [edi + 4*ecx]
      inc ecx
      cmp ecx, fsize
    jl @again
    mov @result, eax
  end;
end;

var i1,i2:integer;
For i1:=0 to List1.Count-1 do
begin
i2:=GetCheckSum(List1[i1]);
List1[i1]:=List[i1]+'|'+IntToStr(i2);
end;

то же со 2 стринглистом.


Теперь мы имеем листы с именем файла и через разделитель "|" контрольная сумма.

Далее сравниваем листы по контрольным суммам и в случае одинаковости контрольных сумм по содержимому файлов.

Код

var i1,i2:integer;
for i1:=0 to list1.Count-1 do
begin
For i2:=0 to List2.Count -1 do
  begin
   if cNFi(2,List2[i2],'|')=cNFi(2,List1[i1],'|') then  // Внимание контрольные суммы одинаковые
      begin
          if Are2FilesEqual(cNfi(1,List1[i1],'|'),cNFi(2,List2[i2],'|') //файлы одинаковые
           {Делаем что нибудь}
      end;
 end;

end;


И не забыть в конце
Код

List1.Free;List2.Free



в данном случае вместо использования Are2FilesEqual лучше написать свою функцию (Are2FilesEqual в модуле mysys загружает файлы в память и если фалйы большие то это не правильно) нужно написать свою функцию используя например BlockRead (если не ошибаюсь) и сравнивать блоки.

p.s.Сначала наверно нужно сравнить файлы между собой на каждом из дисков

Это сообщение отредактировал(а) SlaUr - 18.11.2004, 08:40
PM MAIL   Вверх
dm9
Дата 18.11.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

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



Я бы сначала сравнивал по размеру, потом по контр. суммам, а затем уже побайтно smile
PM MAIL ICQ   Вверх
SlaUr
Дата 18.11.2004, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dm9Да ,вы правы,по моему это наиболее быстрый способ,просто я сравнивал с помощью вышенаписанного алгоритма картинки(кнопки) а они почти все одинакового размера

Это сообщение отредактировал(а) SlaUr - 18.11.2004, 08:35
PM MAIL   Вверх
p0s0l
Дата 18.11.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Ну если идёт речь о супер больших объёмах, то БД тут не сильно спасёт. Самый быстрый способ всё равно будет через массив.
Только вначале его заполняем... Потом сортируем его быстрой сортировкой (или еще более крутым методом), например, по размеру файла (20 млн Single чисел быстрой сортировкой без всяких ухищрений сортируются за 6-7 секунд, а тут будут просто Integerы - еще быстрее).
После сортировки найти все одинаковые файлы будет очень просто...



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

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

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

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

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


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

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


 




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


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

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