Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/68: Рейтинг темы: голосов - 68, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18

Программа для поиска повторяющихся текстовых файлов

24.11.2009, 06:54. Показов 13867. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!У меня возникла такая проблема. Мне нужно написать программу в 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 (за его желанием).

На данном этапе у меня имеется следующее:
Есть исходник написанного мной куска программы на С#:
вот он (Вложение)

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

Может кто нибудь подскажет как решить мою проблему?...буду премного благодарен. Дело в том что я застрял даже на том ,что не могу получить элементарный контроль над массивом - пытался вывести первую строку...ничего не получилось -почему то выводило все строки сразу.
Вложения
Тип файла: rar kursovoy.rar (36.1 Кб, 118 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.11.2009, 06:54
Ответы с готовыми решениями:

Программа для поиска текстовых файлов
Help, pls! Разработать программу для поиска текстовых файлов, содержащих заданную последовательность символов (передается при запуске,...

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

Программа поиска повторяющихся файлов
Добрый день! Уже пару дней пытаюсь написать программу, которая ищет повторяющиеся файлы в папке. Я пишу в Visual Studio. Главный вопрос:...

31
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
29.11.2009, 00:32
Студворк — интернет-сервис помощи студентам
Куда выводятся? в listbBox1 что ли?
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
29.11.2009, 10:40  [ТС]
Да в лист бокс...в форме....Блин я вчера потом расчехлился и понял....ничего оно не сортирует этот Sorteddirektory...просто тупо выводятся все файлы и дубликаты и не дубликаты в не отсортированом виде....А как дальше с ними работать не знаю..как сделать так ,что б лишние не дубликаты убирались и выводились только дубликаты и отсортированы то есть сгрупированы??cry:

Добавлено через 1 час 42 минуты
Сейчас ламаю голову над тем как заставить при сортировании списка ключей, отсортироваться и значениям что им отвечают...вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SortedDictionary<string, List<FileInfo>> myhash = new SortedDictionary<string, List<FileInfo>>();
            for (j = 0; j < c; j++)
            {
                
                myhash[fileHashes[j]] = lst;//здесь поменял на fileHashes[j] затем что это список ключей и //потом вызовом всего одной метода Sort можно его отсортировать а keyarray[j] -это  строковый //массив - копия   fileHashes[j]
                if (lst != null)
                {
                    (lst as List<FileInfo>).Add(files[j]);//вот здесь немного не пойму что ты делаешь, можешь //поподробнее объяснить?  
                }
                else
                    myhash[fileHashes[j]] = new List<FileInfo> {files[j]};//вот здесь немного не пойму что ты //делаешь, можешь //поподробнее объяснить?  
                fileHashes.Sort();//здесь сортирую массив(список) из ключей
                
                    listBox1.Items.Add(myhash[[j]]);//пытаюсь вывести значения что принадлежат уже отсортированному списку ключей 
                
            }
В результате выводит в полк listBox следующее у меня количество файлов в папке c=4)
(Collection)
(Collection)
(Collection)
(Collection)

То есть возможно оно и выводит уже отсортированные по ключам значения, н оя не му их посмотреть....как мне это сделать?
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
30.11.2009, 01:03
C#
1
 listBox1.Items.Add(myhash[[j]]);//пытаюсь вывести значения что принадлежат уже отсортированному списку ключей
эту строчку удаляешь

C#
1
2
3
4
5
6
7
foreach(object key in fileHashes.Keys){
List<FileInfo> lst = fileHashes[key] as List<FileInfo>;
if(lst.Count>0){
//тут пишешь свой код. Тут только дубликаты будут
 
}
}
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
30.11.2009, 17:07  [ТС]
Спасибо огромное, только я не много не понял вот этого:
"//тут пишешь свой код. Тут только дубликаты будут" какой именно код здесь писать???
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
30.11.2009, 17:13
какой хочешь. в список файлы добавить например (listBox1 который)

Добавлено через 33 секунды
там ошибка:
C#
1
lst.Count>1
должно быть
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
30.11.2009, 17:15  [ТС]
Вот код правил код(вроде так как понял тебя):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SortedDictionary<string, List<FileInfo>> myhash = new SortedDictionary<string, List<FileInfo>>();
            for (j = 0; j < c; j++)
            {
                
                myhash[fileHashes[j]] = lst;  
                if (lst != null)
                {
                    (lst as List<FileInfo>).Add(files[j]);
                }
                else
                    myhash[fileHashes[j]] = new List<FileInfo> {files[j]};
                fileHashes.Sort();    
            }
            foreach (object key in fileHashes.Keys)
            {
                List<FileInfo> lst = fileHashes[key] as List<FileInfo>;
                if (lst.Count > 0)
                {
                    //тут пишешь свой код. Тут только дубликаты будут
                    listBox1.Items.Add(lst);
                }
            }
выдает такие ошибки:
Кликните здесь для просмотра всего текста
Error 1 'System.Collections.Generic.List<string> ' does not contain a definition for 'Keys' and no extension method 'Keys' accepting a first argument of type 'System.Collections.Generic.List<string> ' could be found (are you missing a using directive or an assembly reference?) E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 157 47 kursovoy
Error 2 A local variable named 'lst' cannot be declared in this scope because it would give a different meaning to 'lst', which is already used in a 'parent or current' scope to denote something else E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 159 32 kursovoy
Error 3 The best overloaded method match for 'System.Collections.Generic.List<string> .this[int]' has some invalid arguments E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 159 38 kursovoy
Error 4 Argument '1': cannot convert from 'object' to 'int' E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 159 49 kursovoy

что это может быть???... Не могу понять
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
30.11.2009, 17:19
lst это List<FileInfo>
C#
1
2
3
4
5
6
7
8
9
10
11
12
foreach (object key in fileHashes.Keys)
            {
                lst = fileHashes[key] as List<FileInfo>;
                if (lst.Count > 1)
                {
for(int i=0; i<lst.Count; i++){
//TODO проверить что файлы действительно идентичны
listBox1.Items.Add(lst[i]);
}
                   
                }
            }
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
30.11.2009, 17:47  [ТС]
Сделал ка ты сказал -ругается
Error 1 'System.Collections.Generic.List<string> ' does not contain a definition for 'Keys' and no extension method 'Keys' accepting a first argument of type 'System.Collections.Generic.List<string> ' could be found (are you missing a using directive or an assembly reference?) E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 157 47 kursovoy
Error 2 The best overloaded method match for 'System.Collections.Generic.List<string> .this[int]' has some invalid arguments E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 159 23 kursovoy
Error 3 Argument '1': cannot convert from 'object' to 'int' E:\SPZ\курсовой (дубликат)\kursovoy\kursovoy\Form1.cs 159 34 kursovoy

что то с этим не так:
Code
1
fileHashes.Keys)
и этим
Code
1
lst = fileHashes[key]
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
30.11.2009, 18:14
Ну читайте ошибку там чёрным по белому написано что не так.
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
30.11.2009, 19:52  [ТС]
Вот в том то и дело что с английским у меня не очень

Добавлено через 1 час 31 минуту
Слушай, пока я мучаюсь...мне потом нужно будет сделать еще одно дело - Те файлы что я найду, нужно будет при 2-м щелчке мыши по любому из них, чтоб он открывался в блокноте. Я знаю такую функцию ShellExecute, но она для Win Api. Ты случайно не знаешь, какая функция служит аналогом ее на С#???
0
46 / 46 / 3
Регистрация: 18.10.2009
Сообщений: 119
30.11.2009, 20:16
Process p = new Process();

Добавлено через 17 секунд
p.CommandLine = ....
как -то так

Добавлено через 18 секунд
"notepad.exe" должно сработать

Добавлено через 26 секунд
второй аргумент - путь к файлу. Лучше взять его в " т.к. в пути могут быть пробелы
1
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 18
07.12.2009, 20:22  [ТС]
Спасибо огромное за помощь..все получилось. я таки сделал то, что было нужно
Теперь перехожу к последней задаче - упаковка выбранных файлов в архив GZIP. Вот, вроде как, нашел материал по нему:
http://msdn.microsoft.com/ru-r... tream.aspx

Планирую выполнять такие действия:
1) отмечаю галочками файлы для упаковки
2) У меня будет создана кнопка "Упаковать в GZIP архив"
3) при ее нажатии файлы упаковываются и, скорее всего, архив будет лежать в той папке, что задавалась с самого начала мной при поиске дубликатов

Сейчас застрял на том ,что не могу почему когда я делаю компрессию, то файл мой после выполнения программы не сжимается
Взял пример из выше указанной ссылки и переделал его:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.IO;
using System.IO.Compression;
 
public class GZipTest
{
    private const int buffer_size = 100;
 
    public static int ReadAllBytesFromStream(Stream stream, byte[] buffer)
    {
        // Use this method is used to read all bytes from a stream.
        int offset = 0;
        int totalCount = 0;
        while (true)
        {
            int bytesRead = stream.Read(buffer, offset, buffer_size);
            if (bytesRead == 0)
            {
                break;
            }
            offset += bytesRead;
            totalCount += bytesRead;
        }
        return totalCount;
    }
 
    public static bool CompareData(byte[] buf1, int len1, byte[] buf2, int len2)
    {
        // Use this method to compare data from two different buffers.
        if (len1 != len2)
        {
            Console.WriteLine("Number of bytes in two buffer are different {0}:{1}", len1, len2);
            return false;
        }
 
        for (int i = 0; i < len1; i++)
        {
            if (buf1[i] != buf2[i])
            {
                Console.WriteLine("byte {0} is different {1}|{2}", i, buf1[i], buf2[i]);
                return false;
            }
        }
        Console.WriteLine("All bytes compare.");
        return true;
    }
 
    public static void GZipCompressDecompress(string filename)
    {
        Console.WriteLine("Test compression and decompression on file {0}", filename);
        FileStream infile;
        try
        {
            // Open the file as a FileStream object.
            infile = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            byte[] buffer = new byte[infile.Length];
            // Read the file to ensure it is readable.
            int count = infile.Read(buffer, 0, buffer.Length);
            if (count != buffer.Length)
            {
                infile.Close();
                Console.WriteLine("Test Failed: Unable to read data from file");
                return;
            }
            infile.Close();
            MemoryStream ms = new MemoryStream();
            // Use the newly created memory stream for the compressed data.
            GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Compress, true);
            Console.WriteLine("Compression");
            compressedzipStream.Write(buffer, 0, buffer.Length);
            // Close the stream.
            compressedzipStream.Close();
            Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);
            Console.ReadKey();
 
            
        } // end try
        catch (InvalidDataException)
        {
            Console.WriteLine("Error: The file being read contains invalid data.");
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("Error:The file specified was not found.");
        }
        catch (ArgumentException)
        {
            Console.WriteLine("Error: path is a zero-length string, contains only white space, or contains one or more invalid characters");
        }
        catch (PathTooLongException)
        {
            Console.WriteLine("Error: The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters, and file names must be less than 260 characters.");
        }
        catch (DirectoryNotFoundException)
        {
            Console.WriteLine("Error: The specified path is invalid, such as being on an unmapped drive.");
        }
        catch (IOException)
        {
            Console.WriteLine("Error: An I/O error occurred while opening the file.");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("Error: path specified a file that is read-only, the path is a directory, or caller does not have the required permissions.");
        }
        catch (IndexOutOfRangeException)
        {
            Console.WriteLine("Error: You must provide parameters for MyGZIP.");
        }
    }
 
    public static void Main(string[] args)
    {
 
        string usageText = @"C:\Копия lngcode12.gz";
        //If no file name is specified, write usage text.
        
            if (File.Exists(usageText))
            {
                GZipCompressDecompress(usageText);
            Console.ReadKey();
        }
    }
}
помогите пожалуйста разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2009, 20:22

Программа для поиска не повторяющихся слов
Всем привет. Помогите написать функцию которая бы записывала из 1го массива во 2ой не повторяющиеся элементы. Прим.:1ый массив:собака...

Программа для хранения и копирования текстовых файлов
Добрый день программисты! Пишу программу, которая записывает информацию из текстовых файлов в один новый текстовый файл, а потом создаёт из...

Программа для шифрования и расшифровки текстовых файлов
программа для шифрования и расшифровки текстовых файлов.

Программа для сравнения двух текстовых файлов
Составьте программу для сравнения двух текстовых файлов. Если файлы не совпадают, то на экран вывести первые неравные строки и номер...

Программа для поиска файлов
нужна программа на c++ or php которая будет искать файл и загружать его на фтп, программа должна работать скрытно.и добавляла время и дату...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru