Текущий архив: 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.013 c