Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2009, 19:40   #1
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
Восклицание Программа для поиска повторяющихся текстовых файлов

Всем привет!У меня возникла такая проблема. Мне нужно написать программу в Visual studio 2008, которая выполняет поиск дублирующихся файлов в каталоге или на логическом диске. программа должна предоставлять следующие возможности:
· выполнение поиска файлов, которые дублируются, в заданном пользователем адресном пространстве (логическом диске или каталоге);
· сообщение пользователя о найденных дубликатах; возможность навигации между ними;
· сжатие файлов-дубликатов за алгоритмом GZIP.
Общие требования интерфейса программы (обязательные элементы):
· поле введения адресного пространства, в котором будет выполняться поиск дубликатов;
· форма с перечнем найденных файлов, которые дублируются, с возможностью их открытия прямо из дополнения (например, двойным нажатием левой кнопки мыши);
· если несколько текстовых файлов имеют дубликаты, то они должны каким-то образом группироваться; например, на диске присутствуют два одинаковых файла - С:\doc\text1.txt но C:\temp\my\text11.txt, а также на этом диске есть еще три файла, которые дублируются, - С:\doc\text2.txt, C:\temp\text.txt но C:\temp\my\text2.txt; тогда пользователю должны представиться две группы файлов, которые дублируются, - text1.txt и text2.txt (названия групп могут быть любые); причем пользователь должен иметь возможность самому избрать из группы файл-оригинал и файл(и) -дубликати;
· у пользователя должна быть возможность сжатия дубликатов за алгоритмом GZIP (за его желанием).

На данном этапе у меня имеется следующее:
Есть исходник написанного мной куска программы на С#:
вот он http://files.mail.ru/LC6PT7

На данном этапе моя программа по задающемуся пользователем пути отыскивает в каталогах текстовые файлы (*.txt), находит по алгоритму md5 хэш каждого файла сводя их в массив строк и выводя в отдельном текстовом поле формы программы(listbox1). Так вот у меня возникла проблема с тем ,что б потом из полученного масcива из хэшов найти одинаковые строки, свести их в новый массив и вывести в другое строковое поле listbox2.

Может кто нибудь подскажет как решить мою проблему?...буду премного благодарен. Дело в том что я застрял даже на том ,что не могу получить элементарный контроль над массивом - пытался вывести первую строку...ничего не получилось -почему то выводило все строки сразу.
Dmytry вне форума Ответить с цитированием
Старый 24.11.2009, 19:57   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

1. Твой мог бы выложить сюда, чтобы народ не качал, а сразу видел.
2.
Код:
string[] array1=new string[100];
            int j = 1000;
Очень плохой код, а если у тебя файлов больше 1000 будет? Все, попал.
Используй
Код:
List<string> fileHashes = new List<string>();
3. Это я вообще не понял
Код:
 int dlinastr = hash2.Length;
                for (j = 0; j < hash2.Length/32; j++)
                {
                    array1[j] =hash2;
                    listBox1.Items.Add(array1[j]); 
                }
Тебе ведь надо просто хэши сложить:
fileHashes.Add(hash2);

Это по твоему коду.

Но с ним ты далеко не уйдешь (((
Я бы советовал создать Dictionary<string, List<string>>. У тебя ключом будет хэш файла, а значением список файлов с таким хэшем. Потом будет очень легко работать.
Hollander вне форума Ответить с цитированием
Старый 24.11.2009, 20:14   #3
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

Спасибо за помощь..то есть я так понял, что то что я написал не к черту не годится(((((
"Я бы советовал создать Dictionary<string, List<string>>. У тебя ключом будет хэш файла, а значением список файлов с таким хэшем. Потом будет очень легко работать." - а можно вот здесь поподробнее...я не совсем улавливаю смысл этого приема((
Dmytry вне форума Ответить с цитированием
Старый 24.11.2009, 20:17   #4
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

вот код программы:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;

namespace kursovoy
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }

            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }



        private void button1_Click(object sender, EventArgs e)
        {

            // Каталог для створення файлів проекту
            string ProjDir = textBox1.Text;

            //Отображение файлов в каталоге
            string searchPattern = @"*.txt";

            DirectoryInfo di = new DirectoryInfo(ProjDir);
            DirectoryInfo[] directories =
                di.GetDirectories(searchPattern, SearchOption.TopDirectoryOnly);

            FileInfo[] files =
                di.GetFiles(searchPattern, SearchOption.AllDirectories);

            foreach (DirectoryInfo dir in directories)
            {
                listBox1.Items.Add(dir.FullName);
            }
            //Объявление переменных
            string source2;
            string hash2;
           
            string[] array1=new string[100];
            int j = 100;

            foreach (FileInfo file in files)
            {
                
                // Ім'я нового файлу
                string nameFileLab2 = @file.Name;
                
                // Шлях до файлу
                string pathFileLab2 = System.IO.Path.Combine(ProjDir, nameFileLab2);

                // Читання файлу
                string contents2 = System.IO.File.ReadAllText(pathFileLab2);


                source2 = contents2;               
                hash2 = getMd5Hash(source2);
                listBox2.Items.Add(hash2);
                int dlinast = hash2.Length;
                    for ( j = 0; j < hash2.Length/32; j++)
                    {
                        array1[j] = hash2;
                        listBox1.Items.Add(array[j]);
                    }
                    
                
            }
            
        }
  

        private void button2_Click(object sender, EventArgs e)
        {
            
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
}
}
Dmytry вне форума Ответить с цитированием
Старый 24.11.2009, 20:18   #5
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Читаем про коллекции и хэш-таблицы.
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 24.11.2009, 20:37   #6
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

вот нашел ссылку про коллекции и хеш-таблицы:
http://msdn.microsoft.com/ru-ru/libr...hashtable.aspx

Надеюсь я на правильном пути?
Dmytry вне форума Ответить с цитированием
Старый 25.11.2009, 11:26   #7
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Ну давай, ждем результатов. Если что-то не понятно - спрашивай.
Hollander вне форума Ответить с цитированием
Старый 26.11.2009, 10:32   #8
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

Блин у меня появилась реальная проблема....мой алгоритм вычисления хэша не корректно пашет Жаль....Получается он работает если текстовые файлы лежат в том каталоге, что я задаю непосредственно....Если же в заданом мною каталоге лежат еще допустим 2 каталога и в них потом уже - искомые мною файлы -то все программа не работает...не могу никак понять ,что мне нужно подправить что б все заработало Жаль
вот код:
Код:
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Collections;
namespace kursovoy
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //Create a new hash table.
        Hashtable myhash = new Hashtable();


        private void button1_Click(object sender, EventArgs e)
        {

            
           
            // Каталог для створення файлів проекту
            string ProjDir = textBox1.Text;

            //Отображение файлов в каталоге
            string searchPattern = @"*.txt";

            DirectoryInfo di = new DirectoryInfo(ProjDir);
            DirectoryInfo[] directories =
                di.GetDirectories(searchPattern, SearchOption.AllDirectories);

            FileInfo[] files =
                di.GetFiles(searchPattern, SearchOption.AllDirectories);

            foreach (DirectoryInfo dir in directories)
            {
                listBox2.Items.Add(dir.FullName);
            }
            //Объявление переменных
            string source2;
            string hash2;
            List<string> fileHashes = new List<string>();

            //string[] array1=new string[100];
            int j ;
            int c = files.Length; ;//длина массива из файлов в заданном каталоге то есть количество файлов
            int d = directories.Length;//длина массива из путей директорий то есть количество каталогов


            foreach (FileInfo file in files)
            {
                for (j = 0; j < d; j++)
                {
                    // Ім'я нового файлу
                    string nameFileLab2 = @file.Name;

                    // Шлях до файлу
                    string pathFileLab2 = System.IO.Path.Combine(ProjDir, nameFileLab2);

                    // Читання файлу
                    string contents2 = System.IO.File.ReadAllText(pathFileLab2);


                    source2 = contents2;
                    hash2 = getMd5Hash(source2);

                    fileHashes.Add(hash2);

                    listBox2.Items.Add(hash2);
                }
                
                
            }
            
    

            listBox1.Items.Add(c);
            listBox1.Items.Add(d);
           
         
               for (j = 0; j < c; j++)
            {
                myhash.Add(fileHashes[j], files[j]);
            }
            
            listBox1.Items.Add(myhash[fileHashes[0]]);
        }
  

        private void button2_Click(object sender, EventArgs e)
        {
            
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
}
}
Dmytry вне форума Ответить с цитированием
Старый 26.11.2009, 21:59   #9
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

я тут пошарил и с помощью оссобеностей С шарпа решил ту проблему что была до этого:
вот код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;
using System.Collections;
namespace kursovoy
{    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
        static string getMd5Hash(string input)
        {
            // Create a new instance of the MD5CryptoServiceProvider object.
            MD5 md5Hasher = MD5.Create();

            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();

            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            // Return the hexadecimal string.
            return sBuilder.ToString();
        }

        // Verify a hash against a string.
        static bool verifyMd5Hash(string input, string hash)
        {
            // Hash the input.
            string hashOfInput = getMd5Hash(input);

            // Create a StringComparer an comare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;

            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //Объявление переменных
            string source2;
            string hash2;
            List<string> fileHashes = new List<string>();
            List<string> pathtodir = new List<string>();
            //string[] array1=new string[100];
            // Каталог для створення файлів проекту
            string ProjDir = textBox1.Text;
            //Отображение файлов в каталоге
            string searchPattern = "*.txt";
            DirectoryInfo di = new DirectoryInfo(@ProjDir);
            DirectoryInfo[] directories =
                di.GetDirectories("*", SearchOption.AllDirectories);
            FileInfo[] files =
                di.GetFiles(searchPattern, SearchOption.AllDirectories);
            int j;
            int c = files.Length; 
            int d = directories.Length;         
            foreach (DirectoryInfo dir in directories)
            {   
                pathtodir.Add(dir.FullName);
            }
            foreach (FileInfo file in files)
            {
                    // Ім'я нового файлу
                    string nameFileLab2 = file.Name;
                    string pathoffile = file.DirectoryName;
                    // Шлях до файлу
                    string pathFileLab2 = System.IO.Path.Combine(pathoffile, nameFileLab2);
                    // Читання файлу
      string contents2=System.IO.File.ReadAllText(pathFileLab2);                   
                    source2 = contents2;
                    hash2 = getMd5Hash(source2);
                    fileHashes.Add(hash2);
        }              
            listBox3.Items.Add(c);
            listBox4.Items.Add(d);
            //fileHashes.Sort();
            string[] keyarray = new string[c];
            fileHashes.CopyTo(keyarray);
            for (j = 0; j < c; j++)
            {
                listBox2.Items.Add(files[j]);
                listBox1.Items.Add(keyarray[j]);
            }
            Hashtable myhash = new Hashtable();
            for (j = 0; j < c; j++)
            {
                myhash.Add(keyarray[j], files[j]);                
                listBox1.Items.Add(myhash[fileHashes[j]]);
            }   
        }
        private void button2_Click(object sender, EventArgs e)
        {
            
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void listBox4_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
}
}
Dmytry вне форума Ответить с цитированием
Старый 28.11.2009, 15:54   #10
Dmytry
Пользователь
 
Регистрация: 16.09.2009
Сообщений: 10
По умолчанию

Hollander - по твоему совету создал словарь, что содержит комбинации "ключ-значение"..Ты говорил ,что потом будет очень все легко...Вот я не могу понять в чем легко?....Мне нужно получается выбрать с полученого словаря одинаковые имена файлов а как это сделать не могу понять
Dmytry вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос для склеивание двух текстовых файлов zenner Microsoft Office Word 1 09.10.2009 14:16
Программа для скрытия информации с графических и текстовых файлах (Delphi\C++) Ferrat Помощь студентам 12 04.05.2009 04:25
Выбор компонента для работы с содержимым текстовых файлов[Delphi] sergey31 Помощь студентам 2 28.08.2008 16:53