Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск дубликатов, контрольные суммы 
:(
    Опции темы
Neox_GeForce
Дата 21.5.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно искать дубликаты файлов. Я решил найти контрольные суммы файлов и их сравнивать.
Но какой мне алгоритм использовать
CRC32, MD5,SHA1 какой самый самый быстрый??????? smile 


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
DVariuS
Дата 22.5.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Neox_GeForce, юзай CRC32  smile 
Код можно взять, например, тут.
PM MAIL   Вверх
azesmcar
Дата 22.5.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(DVariuS @  22.5.2009,  09:06 Найти цитируемый пост)
CRC32

CRC32 конечно можно подсчитать быстрее, но не надо забывать о коллизиях, речь идет о хэше файлов на диске - их реально много и повторения могут случаться (особенно учитывая законы Мэрфи).

По скорости Adler32 вроде быстрее CRC32. Но я бы использовал MD5 или SHA1. Надежность важнее smile 

PM   Вверх
azesmcar
Дата 22.5.2009, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



отвечаю на вопрос заданный в соседней теме тем же автором, место этого вопроса здесь, так как он связан с этим топиком.
Цитата

Какое минимальное количество байт файла нужно для генерирование более-менее устойчивой CRC суммы(Нужно для поиска дубликатов файла)?

не думаю что кто нибудь сможет ответить на этот вопрос. Таких чисел никто не называeт, просто знай что CRC32 имеет низкую вероятность коллизий, но все же выше чем MD5 и SHA1. Для коротких текстов вероятность коллизий почти достигает нуля..но в том то и дело что почти smile
это все теория.

Это сообщение отредактировал(а) azesmcar - 22.5.2009, 13:45
PM   Вверх
Neox_GeForce
Дата 22.5.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно найти дубликаты файлов и вывести путь до груп дубликатов. Я решил делать поиск по контрольной сумме. но там задача что есть несколько сотен тисяч файлов и макс размер до 2гб.+программа должна быть производительней.
Я придумал такой алгоритм:
1. Сохраняем сумму и путь к файлу у списке.
2. потом ищу одинаковые значение к.с
еще раз по точнее проверяю ети файли.
Вывожу результати. 
Вот такое я придумал. smile 


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Neox_GeForce @  22.5.2009,  13:45 Найти цитируемый пост)
вывести путь до груп дубликатов

в принципе не страшно..можно и CRC32..а когда найдешь дубликаты - вот тогда можно проверить и остальными чтобы удостоверится.
я бы сделал так.

1. Проверить размеры файлов - если не одинаковые - даже не считать сумму.
2. Если размеры одинаковые - подсчитать CRC32, проверить, если не одинаковые - забыть про этот файл и идти дальше
3. Если CRC32 одинаковые - проверить сумму MD5.

сводится к тому чтобы обращатся к сложным и медленным алгоритмам как можно реже.
PM   Вверх
PashaPash
Дата 22.5.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Neox_GeForce, можешь еще добавить 
1. Сравнение размера.
2. Рассчет и кэширование контрольной суммы только при нахождении файлов с одинаковым размером.

Добавлено через 31 секунду
azesmcar, обогнал...


--------------------
PM MAIL WWW   Вверх
Neox_GeForce
Дата 22.5.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вижу надо какие то исходники показать.

Добавлено через 13 минут и 58 секунд
Цитата(azesmcar @ 22.5.2009,  13:49)
Цитата(Neox_GeForce @  22.5.2009,  13:45 Найти цитируемый пост)
вывести путь до груп дубликатов

в принципе не страшно..можно и CRC32..а когда найдешь дубликаты - вот тогда можно проверить и остальными чтобы удостоверится.
я бы сделал так.

1. Проверить размеры файлов - если не одинаковые - даже не считать сумму.
2. Если размеры одинаковые - подсчитать CRC32, проверить, если не одинаковые - забыть про этот файл и идти дальше
3. Если CRC32 одинаковые - проверить сумму MD5.

сводится к тому чтобы обращатся к сложным и медленным алгоритмам как можно реже.

так надо сохранить  размер файла-путь к файлу
а потом искать одинаковые размеры.
да??

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Comparer.rar 67,34 Kb


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата(Neox_GeForce @  22.5.2009,  14:08 Найти цитируемый пост)
вижу надо какие то исходники показать.

а в чем проблема то?

Цитата(Neox_GeForce @  22.5.2009,  14:08 Найти цитируемый пост)

так надо сохранить  размер файла-путь к файлу
а потом искать одинаковые размеры.
да??

ну да, сперва ищешь файлы с одинаковым размером, потом с той же суммой црц32, потом контрольный выстрел - мд5
PM   Вверх
Neox_GeForce
Дата 22.5.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а хорошо ли  я сохраняю списко файлов

Код

 public struct tablefile
    {
        public long length;
        public string fullName;
        public tablefile(long h, string n)
        {
            this.length = h;
            this.fullName = n;
        }
    };


public void AddFileToTable(string filename)
   {
       FileInfo fil = new FileInfo(filename);
       long len= fil.Length;
       FileList.Add(new tablefile(len,filename));
   }



--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Neox_GeForce

Я бы хранил в Dictionary
Ключ - размер файла, значение - путь к файлу.
Если такой размер уже есть, выделаешь в отдельный контейнер для дальнейшего сравнения. Типа того.
PM   Вверх
Neox_GeForce
Дата 22.5.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не это для меня засложно. smile 


Это сообщение отредактировал(а) Neox_GeForce - 22.5.2009, 15:47


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Neox_GeForce

что тут сложного то? подожди, попозже скину примеры (хотя может до меня это кто нибудь другой сделает)

Это сообщение отредактировал(а) azesmcar - 22.5.2009, 15:32
PM   Вверх
Neox_GeForce
Дата 22.5.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



думаю использовать SortedList

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


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    struct SimilarFiles
    {
        public string file1_;
        public string file2_;
    }

    static class FileHelper
    {
        public static List<string> GetFilesRecursive(string b)
        {
            List<string> result = new List<string>();
            Stack<string> stack = new Stack<string>();
            stack.Push(b);
            while (stack.Count > 0)
            {
                string dir = stack.Pop();
                try
                {
                    result.AddRange(Directory.GetFiles(dir, "*.*"));
                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Cannot open directory ({0}}", e.Message);
                }
            }
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<long, string> temp = new Dictionary<long, string>();

            List<SimilarFiles> files = new List<SimilarFiles>();

            List<string> dirs = FileHelper.GetFilesRecursive("C:\\downloads\\");

            foreach (string path in dirs)
            {
                FileInfo info = new FileInfo(path);
                
                string file;
                if (!temp.TryGetValue(info.Length, out file))
                {
                    temp.Add(info.Length, path);
                } else
                {
                    SimilarFiles f;
                    f.file1_ = path;
                    f.file2_ = file;
                    files.Add(f);
                }
            }
        }
    }
}

после выполнения - в переменной files у нас лежат все файлы каталога с тем же самым размером.
PM   Вверх
Neox_GeForce
Дата 22.5.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал так
Код

  public class ListFiles
    {
        ArrayList length = new ArrayList(100);
        ArrayList name = new ArrayList(100);
        public void addFilesToList(long l, string name)
        {
            this.length.Add(l);
            this.name.Add(name);
        }

    }

в рекурсивной функции уже зачисляю.
Диск Е: прошло за 10 сек
а С: за 3 минуты

Это сообщение отредактировал(а) Neox_GeForce - 22.5.2009, 16:19


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
azesmcar
Дата 22.5.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Neox_GeForce

Зачем? для этого же Dictionary есть. У него и поиск намного быстрее (логаритмическая сложность) и вместо двух контейнеров будет один. Я пример привел на предыдущей странице.
PM   Вверх
Любитель
Дата 22.5.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Тебе надо найти все дубликаты или найти дубликаты для известного файла?


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 22.5.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @ 22.5.2009,  16:09)
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    struct SimilarFiles
    {
        public string file1_;
        public string file2_;
    }

    static class FileHelper
    {
        public static List<string> GetFilesRecursive(string b)
        {
            List<string> result = new List<string>();
            Stack<string> stack = new Stack<string>();
            stack.Push(b);
            while (stack.Count > 0)
            {
                string dir = stack.Pop();
                try
                {
                    result.AddRange(Directory.GetFiles(dir, "*.*"));
                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("Cannot open directory ({0}}", e.Message);
                }
            }
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<long, string> temp = new Dictionary<long, string>();

            List<SimilarFiles> files = new List<SimilarFiles>();

            List<string> dirs = FileHelper.GetFilesRecursive("C:\\downloads\\");

            foreach (string path in dirs)
            {
                FileInfo info = new FileInfo(path);
                
                string file;
                if (!temp.TryGetValue(info.Length, out file))
                {
                    temp.Add(info.Length, path);
                } else
                {
                    SimilarFiles f;
                    f.file1_ = path;
                    f.file2_ = file;
                    files.Add(f);
                }
            }
        }
    }
}

после выполнения - в переменной files у нас лежат все файлы каталога с тем же самым размером.

круто. НО в files сохраняется одинаковых значений.
тоесть если в каталоге ести одинаковые файли 1,11,111
to files[0]=11,1

files[1]=111,1

тоесть
если есть 20 одинаковых файлов
то будет 20!/(18!) 380пар.

П.С стековая версия  обхода каталогов понравилась  smile 

Добавлено @ 17:08
Цитата(Любитель @ 22.5.2009,  16:28)
Тебе надо найти все дубликаты или найти дубликаты для известного файла?


Все дубликаты

и вывести групы дубликатов

Это сообщение отредактировал(а) Neox_GeForce - 22.5.2009, 17:18


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Neox_GeForce
Дата 22.5.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я тут придумал. тока не знаю как реализовать.
надо чота типа такого
"размер файла"-список файлов
"размер файла1"-список файлов

МОжно ли обновлять значения словаря по заданому ключу????? smile 

Это сообщение отредактировал(а) Neox_GeForce - 22.5.2009, 19:05


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 22.5.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Лучше не размер. А Dictionary<CustomKey, List<string>>. CustomKey будет хранить размер и хеш. И перегружать Equals и GetHashCode, чтобы сравнивать вначале размер, а затем (если понадобится - хеш). Можно ещё считать хеш только по требованию, чтобы для файлов с "уникальным" размером вообще не считать его.


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 22.5.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



гм..
не пойму.

1. у меня есть список файлов каталога и пустой словарь 

дальше я не могу придумать норм алгоритм который би собирал дубликаты в групы(тоесть списки).

И СustomKey ето что? структура?

Это сообщение отредактировал(а) Neox_GeForce - 22.5.2009, 19:52


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 23.5.2009, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Суть CustomKey - в переопределении Equals (если размеры не равно - хеши не сравниваем), ну и GetHashCode соответственно. Далее, key сам знает для какого он файла создавался (путь). Это позволит при вызове Equals, если равны размеры у двух ключей - вызвать (у обоих) подсчёт хеша файла и сравнить его (лишний раз хеш считаться не будет - для файлов "одиночек" по размеру). После подсчёта хеша - используем *в дальнейшем) рассчитанный хеш (сделай его nullable полем, например, чтобы проще было определить рассчитан или нет). Имя файла больше не несёт смысла. При такой реализации ключа достаточно пройтись по всему дереву каталогов, создать для каждого элемента ключ, сделать TryGetValue для дикшенри (если ничего не получили - создаём новый список и добавляем в дикшенри), добавить файл в список. После обхода по дереву каталогов, проходим по элементам дикшенри, если в списке больше одного элемента - это потенциальные кандидаты. Тут уже делаем full content comparsion.


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 23.5.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @ 23.5.2009,  00:38)
пройтись по всему дереву каталогов, создать для каждого элемента ключ, сделать TryGetValue для дикшенри (если ничего не получили - создаём новый список и добавляем в дикшенри), добавить файл в список.

(если ничего не получили - создаём новый список и добавляем в дикшенри)
а если получили то куда ? в Словарь? но он же не сохраняет одинаковые ключи?

Это сообщение отредактировал(а) Neox_GeForce - 23.5.2009, 15:19


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 23.5.2009, 20:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Если получили - добавляем элемент в полученный список.

Код

List<string> filesList;
if (!filesInfo.TryGetValue(key, out filesList))
{
    filesList = new List<string>();
    filesInfo.Add(key, filesList);
}

filesList.Add(fileName);



--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 23.5.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @ 23.5.2009,  00:38)
Суть CustomKey - в переопределении Equals (если размеры не равно - хеши не сравниваем), ну и GetHashCode соответственно. Далее, key сам знает для какого он файла создавался (путь)

и как переопределить Equals i GetHashCode, там ошибки
"ConsoleApplication1.Program.CustomKey.Equals(ConsoleApplication1.Program.CustomKey, ConsoleApplication1.Program.CustomKey)": не найден метод, пригодный для переопределения


КастомКей имеет три поля размер контрольная сумма и путь
Я правильно понял?

Код

 public class CustomKey
        {
            public long length;
            public int Code;
            public string path;
                       public CustomKey(long l, int k)
            {
                this.length = l;
                this.Code = k;
            }
            public CustomKey(long l)
            {
                this.length =l;
                this.Code =0;
            }

            public override bool Equals(object obj)
            {
                CustomKey lk = obj as CustomKey;
                if (length != lk.length) return false;
                else
                    if (GetHashCode() != lk.GetHashCode()) return false;
                    else
                        return true;
            }
            public override int GetHashCode()
            {
                uint crc = 0;
                byte[] data = new Byte[1024];
                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

                fs.Read(data, 0, 1024);
                crc =Comparer.CRC32.Compute(data);
                return (int)crc;
            }

        }


Это сообщение отредактировал(а) Neox_GeForce - 23.5.2009, 22:05


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Neox_GeForce
Дата 23.5.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Любитель @ 23.5.2009,  20:54)
Если получили - добавляем элемент в полученный список.

Код

List<string> filesList;
if (!filesInfo.TryGetValue(key, out filesList))
{
    filesList = new List<string>();
    filesInfo.Add(key, filesList);
}

filesList.Add(fileName);


словарь у тя  такой
Код

 Dictionary<CustomKey,List<string>> filesInfo = new Dictionary<CustomKey,List<string>>();


Вот какой у меня код
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace ConsoleApplication1
{
    static class FileHelper
    {
        public static List<string> GetFilesRecursive(string b)
        {
           
            List<string> result = new List<string>();
            Stack<string> stack = new Stack<string>();
            stack.Push(b);
            while (stack.Count > 0)
            {
                string dir = stack.Pop();
                try
                {
                   result.AddRange(Directory.GetFiles(dir, "*.*"));

                    foreach (string dn in Directory.GetDirectories(dir))
                    {
                        stack.Push(dn);
                    }
                }
                catch (UnauthorizedAccessException)
                {
                    Console.WriteLine("Cannot open directory ({0})", dir);
                }
                catch (DirectoryNotFoundException )
                {
                    Console.WriteLine("Каталог ("+"{0}"+") не существует",dir);
                }
            }
            return result;
        }
    }
    public class CustomKey
        {
            private long length;
            private int Code;
            private string path;
           public CustomKey(long l, int k)
            {
                this.length = l;
                this.Code = k;
            }
            public CustomKey(string path)
            {
                FileInfo fl = new FileInfo(path);
               this.length= fl.Length;
               this.path= fl.FullName;
            }

            public override bool Equals(object obj)
            {
                CustomKey lk = obj as CustomKey;
                if (length != lk.length) return false;
                else
                    if (GetHashCode() != lk.GetHashCode()) return false;
                    else
                        return true;
            }
            public override int GetHashCode()
            {
                uint crc = 0;
                byte[] data = new Byte[1024];
                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

                fs.Read(data, 0, 1024);
                crc =Comparer.CRC32.Compute(data);
                return (int)crc;
            }

        }
    class Program
    {
       
        static void Main(string[] args)
        {
            try
            {
                Stopwatch st = new Stopwatch();
                st.Start();
                
                Dictionary<CustomKey,List<string>> filesInfo = new Dictionary<CustomKey,List<string>>();
                List<string> filelist = FileHelper.GetFilesRecursive("E:\\Compare"); //Список файлов каталога
          
                for (int i = 0; i < filelist.Count; i++)
                {
                    CustomKey temp= new CustomKey(filelist[i]);
                    List<string> filesList;
                    if (!filesInfo.TryGetValue(temp, out filesList))
                    {
                        filesList = new List<string>();
                        filesInfo.Add(temp, filesList);
                    }

                    filesList.Add(filelist[i]);
                }

             Console.WriteLine("\n{0}", st.ElapsedMilliseconds);
              
            }
            catch (IndexOutOfRangeException )
            {
                Console.WriteLine("Помилка!\nНе введено каталог пошуку!");
            }
            catch(Exception e)
            {
                Console.WriteLine("Неожиданная ошибка! \n", e.Message);
            }
            Console.ReadLine();
        }
        
    }
}

З.Ы неработает подсветка

Это сообщение отредактировал(а) Neox_GeForce - 24.5.2009, 11:06


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 24.5.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Neox_GeForce @  23.5.2009,  22:35 Найти цитируемый пост)
код какой то не  ясный. ЧТо он делает?

Пытается получить список файлов для определённого ключа, если нету такого - создаёт новый список и добавляет его на этот ключ в словарь. Затем добавляет файл в список. Всё просто.

GetHashCode ты не правильно переопределил. В данном случае выигрыша ноль (Dictionary будет всегда вызывать твой GetHashCode, да и ещё он у тебя не кешируется). Я бы вообще вернул в GetHashCode length. А в Equals:

Код

CustomKey otherKey = obj as CustomKey;
return otherKey != null && otherKey.length == this.length && otherKey.Hash == this.Hash;


Где Hash - прайват проперти:
Код

private uint? hash = null;

private uint Hash
{
    get
    {
        if (hash == null)
        {
            // твой рассчёт хеша, сохраняешь в поле hash
        }

        return hash.Value;
    }
}


Вот как-то так.

И ещё - зачем тебе два прохода по файлам? Можно вместо result.AddRange(Directory.GetFiles(dir, "*.*")); сразу сделать foreach по файлам каталога и добавить их (как описано выше) в dictionary.


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 24.5.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня выскакивает exception. отказано в доступе. как побороть то?
и 
Код

return (int)crc;
  не видно из-за блока try 
Код

    public override int GetHashCode()
            {
                try
                {
                    uint crc = 0;
                    byte[] data = new Byte[1024];
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                    fs.Read(data, 0, 1024);
                    crc = Comparer.CRC32.Compute(data);
                    return (int)crc;
                }
                catch (Exception e)
                {
                   Console.WriteLine("Ошибка! {0}", e.Message);
               }
            }



Это сообщение отредактировал(а) Neox_GeForce - 24.5.2009, 12:32


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Neox_GeForce
Дата 24.5.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал.
Протестите пожалуйста.
Задание у мя было такое:
Найти одинаковые файлы по содержимому и вывести группы одинаковых файлов.

Кажется работает 

Это сообщение отредактировал(а) Neox_GeForce - 24.5.2009, 20:56

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Comparer.rar 73,77 Kb


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 24.5.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



GetHashCode у тебя опять очень неоптимально перегружен. Ещё раз - при каждом добавлении в дикшенри будет считаться хеш (не CRC32 и пр., а тот, который GetHashCode) добавляемого ключа. А затем уже (в случае колизий) - Equals. Учитывая, что файлов с одним размером не так уж много - в GetHashCode достаточно вернуть length.


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 24.5.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я вот так сделал:
Код

  public override bool Equals(object obj)
            {
                CustomKey otherKey = obj as CustomKey;
                if (otherKey != null && otherKey.length == this.length)
                {
                    if (otherKey.Hash == this.Hash) return true;
                    else return false;
                }
                else
                    return false;
             // return otherKey != null && otherKey.length== this.length && otherKey.Hash == this.Hash; 
            }
            public override int GetHashCode()
            {
             
               return (int)this.Length;
            }




и не знаю что быстрее будет работать в Equals
и что 

Код

private uint? hash = null;

знак вопроса значит? догадался что можно нуллом инициализироаать, а по точнее?

Это сообщение отредактировал(а) Neox_GeForce - 24.5.2009, 19:29


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
Любитель
Дата 24.5.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(Neox_GeForce @  24.5.2009,  19:21 Найти цитируемый пост)
я вот так сделал:

Equals до этого был нормальный. GetHashCode сейчас тоже. "Вопросик" - это nullable типы. Читай синтаксис C# 2.0. Но это уже оффтопик..


--------------------
PM MAIL ICQ Skype   Вверх
Neox_GeForce
Дата 24.5.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кажется сделал. Любитель Огромное спасибо!!!

Добавлено @ 00:03
Но может есть другой алгоритм поиска дубликатов?  smile Побыстрее бы smile

диск С: за 40 мин 103802 файлов
диск Е: за 2.5 мин 9398 файлов

Это сообщение отредактировал(а) Neox_GeForce - 25.5.2009, 00:36

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  Comparer.rar 69,29 Kb


--------------------
user posted image
Челябинские программисты настолько суровы, что обходятся без компиляторов.
Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска.
PM MAIL ICQ   Вверх
marionet
Дата 6.9.2011, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



привет всем !!! у меня похожа проблема только дубликаты нужно искать путем сравнения размера файлов, даты их последнего изменения и названия.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

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


 




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


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

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