Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.01;
Скачать: CL | DM;

Вниз

Поиск файлов-дубликатов на диске   Найти похожие ветки 

 
dmitry_12_08_73 ©   (2009-09-06 10:21) [0]

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


 
TIF ©   (2009-09-06 10:37) [1]

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

FindFirst, FindNext + F1
TSearchRec + F1

> имя

TSearchRec.Name

> размер

TSearchRec.FindData.nFileSizeHigh
и
TSearchRec.FindData.nFileSizeLow

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

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

TSearchRec.FileGetDate


 
dmitry_12_08_73 ©   (2009-09-06 11:13) [2]

Извините, я наверное плохо объяснил.
Как найти имя, размер и время создания я знаю.
Мне надо найти файлы на диске, С:\, например, которые имеют одинаковые все три этих атрибута. В результате получить список типа:
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


 
KilkennyCat ©   (2009-09-06 11:18) [3]


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

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


 
oldman ©   (2009-09-06 11:57) [4]


> dmitry_12_08_73 ©   (06.09.09 10:21)  


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


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


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


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


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

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

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



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;


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


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

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

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


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

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


 
Alx2 ©   (2009-09-15 21:32) [9]

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


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


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

Alx2 ©   (15.09.09 21:32) [9]


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


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


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


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

-1


 
Anatoly Podgoretsky ©   (2009-09-16 11:27) [12]

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

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


 
Sha ©   (2009-09-16 15:30) [13]

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

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


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


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


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


 
Anatoly Podgoretsky ©   (2009-09-17 13:46) [15]

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

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



Страницы: 1 вся ветка

Текущий архив: 2011.05.01;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
15-1295532470
DevilDevil
2011-01-20 17:07
2011.05.01
pf15bit. Потестируйте код


2-1296124073
mefodiy
2011-01-27 13:27
2011.05.01
Передача указателя через ShellExecute


3-1257679804
Дмитрий Белькевич
2009-11-08 14:30
2011.05.01
Ососбенность Delphi 2010. Регистрозависимое написание чарсета


1-1252218090
dmitry_12_08_73
2009-09-06 10:21
2011.05.01
Поиск файлов-дубликатов на диске


15-1295626824
Анонимный анонимус.
2011-01-21 19:20
2011.05.01
Наколки АП.