![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов-дубликатов на диске [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