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

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

Поиск файлов-дубликатов на диске [D7, WinXP]


dmitry_12_08_73 ©   (2009-09-06 10:21:00) 

Подскажите, как найти файлы на диске, которые имеют одно и тоже имя, размер и время создания.


Anatoly Podgoretsky   (2009-09-17 13:46:00) [1]

> SP  (17.09.2009 13:33:14)  [14]

Ты из контекста то не вываливайся, как обойти коллизии это другой вопрос.


SP   (2009-09-17 13:33:00) [2]


> CRC16 недостаточно, гарантировано совпадение при количестве
> файлов более 65536 - а это не редкость в наше время, у меня
> обычно от 100 до 300 файлов на компьютер.


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


Sha   (2009-09-16 15:30:00) [3]

> Игорь Шевченко ©   (15.09.09 22:49) [10]
> причем, считаю CRC16, совпадений файлов одинакового размера,
> одинакового CRC, но разного содержимого среди своей помойки не наблюдал - может, повезло

Повезло.
Наверно просто файлов одного размера мало.
Из-за парадокса дней рождения совпадения CRC16 должны быть довольно частым явлением.


Anatoly Podgoretsky   (2009-09-16 11:27:00) [4]

> Игорь Шевченко  (15.09.2009 22:49:10)  [10]

CRC16 недостаточно, гарантировано совпадение при количестве файлов более 65536 - а это не редкость в наше время, у меня обычно от 100 до 300 файлов на компьютер.


Германн   (2009-09-16 00:30:00) [5]


> Сколько ж людей маются одинаковой дурью ? :)

-1


Игорь Шевченко   (2009-09-15 22:49:00) [6]

Alx2 ©   (15.09.09 21:32) [9]


> Сам как-то писал такую штучку для генеральной уборки: сортировал
> одинаковоразмерные файлы по CRC


Сколько ж людей маются одинаковой дурью ? :) Я своей подобной поделкой до сих пор пользуюсь, причем, считаю CRC16, совпадений файлов одинакового размера, одинакового CRC, но разного содержимого среди своей помойки не наблюдал - может, повезло.


Alx2   (2009-09-15 21:32:00) [7]

> также для фалов одного и того же размера лучше проверять
> их CRC


Ага. Но лучше для файлов с одинаковым CRC проверять на совпадение их начинку.
Сам как-то писал такую штучку для генеральной уборки: сортировал одинаковоразмерные файлы по CRC. Затем файлы с одинаковым CRC считал дублями. Начинку не проверял - паранойя не была нужна, так как вероятность случайного совпадения CRC для разных файлов что-то вроде 10^(-9). А у меня файлов лишь около миллиона. Да и ложная сработка не была критичной.


dmitry_12_08_73   (2009-09-07 18:40:00) [8]

спасибо всем, буду пробовать


Ruzzz   (2009-09-06 16:48:00) [9]

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

также для фалов одного и того же размера лучше проверять их CRC


Ruzzz   (2009-09-06 16:44:00) [10]

Нужно "пройти по дереву каталогов", гугли, примеры есть

вот кусочек старого кода, но возможно найдешь лучше :)



type
 TPassThroughDirFunc = function(FindData, UserData: Pointer): boolean;

// Example: RootDirMask = c:\Pictures\*.jpg
// if WorkFunc.Result = true then Continue Loop else Break
procedure PassThroughDir(RootDirMask: String; UserData: Pointer; WorkFunc: TPassThroughDirFunc);
var
 FindData: TWIN32FindData;
 Handle: Cardinal;
begin
 Handle := Windows.FindFirstFile(PChar(RootDirMask), FindData);
 if Handle = INVALID_HANDLE_VALUE then exit;
 try
   repeat
   until (not WorkFunc(@FindData, UserData)) or
         (not Windows.FindNextFile(Handle, FindData));
 finally
   Windows.FindClose(Handle);
 end;
end;


Попробуй создать список, содержащий нужные для сравнения атрибуты файла, пройди по всему дереву каталогов - просканируй все файлы, занося в свой список их атрибуты, а потом применяй алгоритм поиска дубликатов к этому списку


oldman   (2009-09-06 11:59:00) [11]


> Подскажите, как найти файлы на диске, которые имеют одно
> и тоже имя, размер и времясоздания.


То есть, если три файла-дубля имеют разное время (разница 1 минута) ты их не найдешь?


oldman   (2009-09-06 11:57:00) [12]


> dmitry_12_08_73 ©   (06.09.09 10:21)  


а ты уверен, что в самих файлах идентичное содержание?


KilkennyCat   (2009-09-06 11:18:00) [13]


> имеют одинаковые все три этих атрибута

if (size1 = size2) and (name1 = name2) and (time1 = time2) then одинаково


dmitry_12_08_73   (2009-09-06 11:13:00) [14]

Извините, я наверное плохо объяснил.
Как найти имя, размер и время создания я знаю.
Мне надо найти файлы на диске, С:\, например, которые имеют одинаковые все три этих атрибута. В результате получить список типа:
111.txt   с:\temp               39кб     01.01.2009
111.txt   с:\temp\1            39кб     01.01.2009
111.txt   с:\temp\2            39кб     01.01.2009
222.txt   с:\                     41кб     05.05.2009
222.txt   c:\Borland\          41кб     05.05.2009
222.txt   c:\Borland\temp\  41кб     05.05.2009


TIF   (2009-09-06 10:37:00) [15]

> как найти файлы на диске

FindFirst, FindNext + F1
TSearchRec + F1

> имя

TSearchRec.Name

> размер

TSearchRec.FindData.nFileSizeHigh
и
TSearchRec.FindData.nFileSizeLow

Посмотреть на ограничение типа переменной в которой хванятся эти значения, понять, на каком размере файла они перестанут выдавать правильные значения, составить формулку для подсчёта правильного размера, вроде как-то так:
Size:=TS.FindData.nFileSizeHigh*4294967296+ts.FindData.nFileSizeLow;

> время создания

TSearchRec.FileGetDate


Наверх

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