Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3]  Все   Вниз
  Печать  
Автор Тема: Программа для поиска повторяющихся текстовых файлов  (Прочитано 76191 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #60 : 01-12-2009 18:57 » 

Да, я про этот ListView. У него функциональность намного шире, чем у ListBox. В чистом WinAPI есть способы хранить в нём дополнительные данные (помимо собственно выводимого текста, хранить в элементах и другие данные) - здесь тоже должны быть.
Записан
Dmytry
Гость
« Ответ #61 : 01-12-2009 19:29 » 

Я пробовал с ним разобраться - кое что выходит. Но здесь ,я так понял,  чем то похожим на  ListBox.Item.Add() - ничего не выведешь...нужно создавать этот ListView, потом устанавливать его параметры, задавать переменные и потом в них выводить нужные нам списки. Я поgробую дальше разобраться, но что то я, если честно, не могу понять, как тогда поступать с выводом и что хранить в списках Hashtable - пути к файлу и все же весь файл целиком(с параметрами имени и пути к нему)?. И какого он тогда типа будет вообще?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #62 : 01-12-2009 20:09 » 

Dmytry, на мой взгляд, ты усложняешь себе задачу.

ты строишь массив  хешей, и запихиваешь их в list. Зачем?
работа со списками сложнее чем с  массивами.


2 Вад. списки это красиво, но не понимаю в условиях этой задачи.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #63 : 01-12-2009 20:49 » 

Слав, у него заранее не известно количество элементов в массиве. Поэтому использование списков вполне оправдано. Хотя он пишет на шарпе, там не так актуален вопрос расширяемости массивов, насколько я помню.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #64 : 01-12-2009 21:04 » 

Finch, тут какая штука.

Я не люблю, с очень давних пор,  вообще понятия  указателей, т.е. кучи.
Почему? разговор отдельный.
Потому и  появление шарпа приветствую, потому как он не подразумевает обращения напрямую к "куче".
Но с другой стороны понятие указатель-куча-список, это святое, это классика.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #65 : 01-12-2009 21:18 » 

Слав, топик полностью не читал. Но std::list как контейнер вполне позволяет забыть про указатели-кучу в С++. Насколько я знаю в шарпе со вторым дот нетом есть генерические контейнеры. Которые имеют такой же принцип работы, как list.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dmytry
Гость
« Ответ #66 : 02-12-2009 05:31 » 

Спасибо за советы. Так как мне лучше поступить?Вад предлагает мне выводить результаты поиска в ListView. Я с ним в этом согласен потому что, во-первых, насколько я понял, LisBox, что я сейчас использую для вывода результатов, выводит только те данные, которые я запросил, но не может нести какую-то дополнительную информацию в выводимом элементе. А во-вторых, там есть такой элемент как галочки, что мне, думаю, понадобится при решении последней задачи - выбора дубликатов из списка и упаковывания их с помощью J-ZIP. Задача сейчас у меня стоит следующая - у меня сейчас выводится список имен файлов дубликатов в LisBox, мне нужно реализовать открытие любого из этих файлов на чтение. Я подумал, что самым лучшим вариантом было бы открывать файлы с помощью блокнота. Я нашел  Process - класс, который, как я думаю, поможет мне реализовать открытие файла с помощью приложения. Но есть некоторые нюансы. Мне, чтоб воспользоваться одним из методов этого класса, нужно знать как имя файла, так и полный путь к нему. В программе у меня выводится только одна из этих оставляющих - либо путь, либо имена файлов (у меня по условию задания должны выводиться имена файлов). Вот Вад и подсказал мне, что в таком случае лучше пользоваться  ListView. Может, у кого-то есть другие варианты решения поставленной проблемы?? Поделитесь, пожалуйста.
« Последнее редактирование: 02-12-2009 05:55 от Sel » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #67 : 02-12-2009 06:18 » 

2 Вад. списки это красиво, но не понимаю в условиях этой задачи.
В данном случае, списки - это удобная динамическая структура, для которой не надо думать о её размере. А размер списка дубликатов заранее неизвестен.

Слав, топик полностью не читал. Но std::list как контейнер вполне позволяет забыть про указатели-кучу в С++. Насколько я знаю в шарпе со вторым дот нетом есть генерические контейнеры. Которые имеют такой же принцип работы, как list.
Есть, но ещё и про generic-и объяснять - это уже, на самом деле, красиво, но я не берусь Улыбаюсь Пару намёков на них я, впрочем, давал Улыбаюсь
« Последнее редактирование: 02-12-2009 06:21 от Вад » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #68 : 02-12-2009 06:27 » 

Dmytry, предложения, высказанные выше, относятся не к ListView, а к организации хранения значений в процессе вычисления хэшей для файлов.
Так что это не должно тебя отвлекать от поиска способа отобразить список файлов Улыбаюсь

Кстати, когда ты говоришь
Цитата
Мне, чтоб воспользоваться одним из методов этого класса, нужно знать как имя файла, так и полный путь к нему. В программе у меня выводится только одна из этих оставляющих - либо путь, либо имена файлов (у меня по условию задания должны выводиться имена файлов)
- ты что имеешь в виду под путём к файлу? Я подразумеваю полный путь, включая имя: "C:\temp\1\file.txt".
Чтобы отобразить только имя, необязательно его хранить всё время: в C# должны быть функции для манипуляции с именами файлов (в т.ч. и выделения имени из полного пути) - в крайнем случае, можно стандартными средствами отрезать. Хотя если тебе так удобнее - можно и хранить пару значений.
Записан
Sel
Злобный
Администратор

ru
Offline Offline

« Ответ #69 : 02-12-2009 11:14 » 

Dmytry, исправь ошибки в своем сообщении и опубликуй заново. Предупреждала сто раз, чтобы писАл грамотно. Безграмотные сообщения отныне удаляются.
Записан

Слово не воробей. Всё не воробей, кроме воробья.
Dmytry
Гость
« Ответ #70 : 02-12-2009 11:27 » 

Вот снимок экрана при запуске моей программы:
http://files.mail.ru/VL76NB

Как ты видишь, в первой колонке дубликаты отображаются в виде неполных путей - то есть, путь указан без названия файла. Это значит, что я что-то не так вывожу? Потому как я подозреваю, что эти пути в таком виде и записываются в список Hashtable. Насчет обрезания выводимой части файла - насколько я тебя понял, listBox может сгодитЬся, если будет доступен полный путь к файлу и как-то можно будет вырезать при выводе только имя файла (либо специальными функциями, либо стандартным способом, под которым, я думаю, будет работа с простыми кавычками), или все же ты мне посоветуешь дальше мучить ListView, так как он будет лучше подходить для выполнения 2 поставленных задач: открытие файла, приоритет которого выше, и архивация выделенных файлов в J-Zip??
« Последнее редактирование: 02-12-2009 11:38 от Sel » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #71 : 02-12-2009 12:35 » 

Цитата
Потому как я подозреваю, что эти пути в таком виде и записываются в список Hashtable
Так поставь брейкпойнт и погляди, что именно записывается в Hashtable. В принципе, ты же ведь файл открываешь на чтение по имени, чтобы хэш посчитать - значит, должен быть полный путь до файла, с именем.

Кстати, вырезать имя я считаю не очень хорошей идеей - на самом деле, они же одноимённые могут быть. Поэтому лучше выводить прямо полный путь, чтобы пользователь сразу видел, где какой дубликат лежит (возможны и другие решения, но это кажется мне пока более удачным). Тогда, в принципе, даже дополнительные фичи ListView не нужны. А основные - очень простые: нужно только поставить списковый стиль (что-то типа report) и чек-боксы, которые тебе нужны, включить.
Записан
Dmytry
Гость
« Ответ #72 : 02-12-2009 15:54 » 

По поводу брейкпойнта - признаюсь - не знаю как его поставить, но вот что я скажу по поводу полного пути. У меня функция чтения имеет два параметра: путь к файлу(без имени самого файла) и имя файла. Вот код:
Код:
string nameFile = file.Name;// переменная хранящая имя фалйов
                string pathoffile = file.DirectoryName;//переменная хранящая пути к файлам            
                // Шлях до файлу
                string pathFile = System.IO.Path.Combine(pathoffile, nameFile);
                // Читання файлу
                string contents2 = System.IO.File.ReadAllText(pathFile);
                


Я здесь подумал и вспомнил одно дело. Если у нас переменная, что отвечает за конечный результат, носит тип string, то можно ведь попробовать как-то склеить имя файла и путь. Вот например что-то типа такого:
Код:
// добавляем значение пути в ключ
                ((ArrayList)myhash[hash2]).Add(file.DirectoryName+file.Name);

Только нужно как-то правильно эту запись сформировать, чтоб был еще в строке списка "\".Как тебе такой вариант? Такое возможно?

 
 
 
« Последнее редактирование: 02-12-2009 16:02 от Dmytry » Записан
Dmytry
Гость
« Ответ #73 : 02-12-2009 16:54 » 

Пытаюсь разобраться с ListView. Выходит не очень Здесь была моя ладья...
Вот пример:
Код:
 private void CreateMyListView()
        {// Set the view to show details.
            listView1.View = View.Details;//Это ,как я понял ,включение режима для работы всех остальных настроек
            // Allow the user to edit item text.
            listView1.LabelEdit = false;// Это ,насколько я понял, для редактирования имени файлов прямо из формы. Потому отключил его
            // Allow the user to rearrange columns.
            listView1.AllowColumnReorder = true;
            // Display check boxes.
            listView1.CheckBoxes = true;// Это ,как я понял, те боксы о которых ты говорил
            // Select the item and subitems when selection is made.
            listView1.FullRowSelect = true;// Вот это, толком не могу понять, что имеется ввиду?
            // Display grid lines.
            listView1.GridLines = false;//Это ,как я понял, линии сетки ,чтоб было похоже на таблицу
            // Sort the items in the list in ascending order.
            listView1.Sorting = SortOrder.Ascending;// Это , как я понял, сортировка. Она нужна вообще??
            ListViewItem item1 = new ListViewItem();// Вот здесь тоже немного не пойму.Это получается объявление переменной, что отвечает
за вывод?          
            item1.Checked = true;// Вот это тоже для меня загадка :(
            item1.SubItems.Add("1");// Как я понял, это и есть то, что мне нужно - занесение данных в переменную.
            item1.SubItems.Add("2");
            item1.SubItems.Add("3");
            listView1.Columns.Add("Item Column", -2, HorizontalAlignment.Left);// Вот эти параметры немного смущают меня. Я так понял, здесь указывается, как будут отображаться все данные в listView

            listView1.Columns.Add("Column 2", -2, HorizontalAlignment.Center);
            listView1.Columns.Add("Column 3", -2, HorizontalAlignment.Center);
            listView1.Columns.Add("Column 4", -2, HorizontalAlignment.Center);
            listView1.Items.AddRange(new ListViewItem[] { item1 });// А это, как я понял, вывод в listView всех данных
            // Add the ListView to the control collection.
            this.Controls.Add(listView1);// Не могу понять нужен ли этот параметр? Если дословно перевести, то это добавление коллекции контроля?

Вот, что я понял насчет listView. Мне нужно создать listView, установить его параметры , создать переменную item и потом с помощью item1.SubItems.Add() забивать данные в переменную  item,  а с помощью   listView1.Items.AddRange(new ListViewItem[] { item1 }) выводить все в форму, так?

По поводу стилей (что-то типа report). Я нашел что-то похожее. Называется ListView.HeaderStyle -  возвращает или задает стиль заголовка столбца. Это то, о чем ты говорил?  
« Последнее редактирование: 02-12-2009 16:57 от Dmytry » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #74 : 02-12-2009 21:45 » 

Цитата
По поводу брейкпойнта - признаюсь - не знаю как его поставить
Плохо Улыбаюсь Отладчик в целом и точки останова в частности - наиполезнейшая штука, особенно если нужно разобраться, что именно в программе происходит, и что в ней идёт не так, как задумано. Так что настоятельно рекомендую изучить.

Цитата
Код:
string pathFile = System.IO.Path.Combine(pathoffile, nameFile);
Полагаю, это именно то, что нужно.

С ListView всё немного попроще. Код примера предполагает, что свойства выставляются вручную. На самом деле, есть ещё один способ проставить свойства списка - сделать это в редакторе формы. Там должна быть закладка со свойствами объекта: когда помещаешь ListView на форму, можно отредактировать свойства и посмотреть. Стиль, о котором я говорил, кажется, называется в C# "details view". Дома нет студии, чтоб посмотреть точно.

Насчёт добавления - ты перегнул, диапазон из одного элемента добавлять ни к чему Улыбаюсь Проще тогда  уж сделать listView1.Items.Add(item1);
В любом случае, для каждой строки нужно создавать отдельный элемент. Это нужно делать в цикле. В общем, смотри примеры, пробуй их - на то они и даны, понимай, как оно работает, и применяй к своему случаю
Записан
Dmytry
Гость
« Ответ #75 : 03-12-2009 05:12 » 

Цитата
Полагаю, это именно то, что нужно.
Насколько я тебя понял, ты предлагаешь в Hashtable хранить переменную string pathFile из
Код:
string pathFile = System.IO.Path.Combine(pathoffile, nameFile);
?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #76 : 03-12-2009 13:56 » 

Да, и я это имел в виду с самого начала Улыбаюсь
Записан
Dmytry
Гость
« Ответ #77 : 03-12-2009 17:28 » 

По твоему совету начал разбираться и вот что вышло. Ты говорил ,чтоб я поставил "details view", я нашел этот параметр, поставил его и начал компилировать - тупо пустой ListView! Поставил параметром List - заработало. Поставил еще чек-боксы - вот что вышло(центральная колонка):
http://files.mail.ru/0VIXAI

Вот код того ,что я сделал, чтоб так выводило:
Код:
listView1.CheckBoxes = true;
foreach (DictionaryEntry val in myhash)
            {
                ArrayList lst = (ArrayList)(val.Value);
                if (lst.Count > 1)
                {
                    // Заносим все элементы из списка d.Value в ListBox
                    foreach (string pathToFile in (ArrayList)val.Value)
                    {
                        listView1.Items.Add(pathToFile); //Вывод путей для ключей           
                    }
                }
            }


Но вот у меня появилась маленькая проблема - я не знаю, как отделить дубликаты. В варианте с ListBox, я просто писал строку перед условием:
Код:
listBox1.Items.Add("--ГРУППА ДУБЛИКАТОВ--");


здесь такое не проходит Жаль. Ты не знаешь, как в таком случаи поступить?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #78 : 03-12-2009 20:49 » 

Сортировку убрать нужно. Тогда элементы будут в том порядке, в котором добавлялись.
Записан
Dmytry
Гость
« Ответ #79 : 04-12-2009 05:43 » 

Вад, спасибо огромное за совет - помогло Класс!
Я вчера, пока ждал твоего совета, занялся разработкой функции открытия файлов. По твоему совету использовал класс Process. Потом взял из примера и создал класс, добавил оттуда следующую функцию:
Код:
class MyProcess
        {
public void OpenWithArguments(string pathprocess)
            {
                Process.Start(pathprocess);
            }
        }


Потом объявил общедоступную переменную:
Код:
string ResultPath;//зберігає кінцевий масив із повних шляхів 

Присвоил ей значение массива строк pathToFile в цикле
Код:
foreach (DictionaryEntry val in myhash)
:
Код:
ResultPath = pathToFile;

После этого создал кнопку в форме и записал в нее следующий код:
Код:
private void button2_Click(object sender, EventArgs e)
        {
           
            MyProcess myProcess = new MyProcess();//
            myProcess.OpenWithArguments(ResultPath);

Поробовал при компиляции - открывает, но есть 2 проблемы:
1) Насколько я понял, в ResultPath хранятся все полные пути и доступ к ним можно получить только через цикл. Попробовал создать цикл и вывести все элементы - не получилось. Выдало ошибку - что-то типа того ,что не может перевести с типа char  в string. вот код:
Код:
foreach (string fullpath in ResultPath)
                    {
                        listBox5.Items.Add(fullpath);
            }
2) Не могу понять, как привязать выбор открывающегося файла через чек-боксы. Нашел 2 свойства в ListView:
http://msdn.microsoft.com/ru-ru/library/system.windows.forms.listview.itemcheck.aspx
http://msdn.microsoft.com/ru-ru/library/system.windows.forms.listview.checkeditems.aspx

Не могу понять, какое из них мне нужно Жаль. А может есть еще какой-то способ отслеживать чек-боксы??
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #80 : 04-12-2009 05:54 » 

Опиши, при каких именно действиях должно происходить открытие файлов в блокноте - и каких именно файлов.
BTW, в примере для CheckedItems есть подсказка - обработчик события ItemChecked. Вот с применением обработчиков событий списка и можно отслеживать действия - хоть выделение, хоть клик, хоть любое другое доступное.
Записан
Dmytry
Гость
« Ответ #81 : 04-12-2009 12:04 » 

Открытие файла в блокноте должно выполняться при таких действиях:
1) Ставлю галочку напротив тех файлов ,что хочу открыть(будь это 1,2 или все файлы целиком)
2) У меня есть созданная кнопка "Открыть", когда уже отметил галочками файлы, те, что хочу открыть - нажимаю на эту кнопку
3) В результате начинают открываться те файлы ,что я их отметил галочками , с помощью блокнота
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #82 : 04-12-2009 13:31 » 

Тогда по нажатию кнопки получать список CheckedItems у ListView, выдёргивать оттуда (у item-ов) пути к файлам и открывать блокнотом, в цикле.
Записан
Dmytry
Гость
« Ответ #83 : 04-12-2009 14:56 » 

Спасибо за алгоритм. Буду пробовать.
« Последнее редактирование: 04-12-2009 15:56 от Dmytry » Записан
Dmytry
Гость
« Ответ #84 : 05-12-2009 07:11 » 

Никак не могу понять, как получить список CheckedItems у ListView Жаль Жаль Жаль
Код:
private void listView1_check2(object sender,
        System.Windows.Forms.ItemCheckEventArgs e)
        {
            ListView.CheckedListViewItemCollection checkedItems =
               listView1.CheckedItems;// Насколько я понял, здесь создается коллекция  CheckedItems , в которой будут хранится отмеченные элементы

            foreach (ListViewItem item in checkedItems)
            {
                if (e.CurrentValue == CheckState.Checked)// Здесь,как я понял, выполняется проверка на то ,стоит ли галочка или нет
                {
                    listBox5.Items.Add("proba");//Это я пробовал при выполнении условия для начала просто вывести надпись в  listBox5   
                }
            }
        }

И ничего не получается Жаль
Записан
Dmytry
Гость
« Ответ #85 : 05-12-2009 08:06 » 

УРА! Все получилось. Если честно, даже не ожидал, что все будет так просто:
Код:
private void button2_Click(object sender, EventArgs e)
        {
                MyProcess myProcess = new MyProcess();
                ListView.CheckedListViewItemCollection checkedItems =
                listView1.CheckedItems;
                foreach (ListViewItem item in checkedItems)
                {
                    myProcess.OpenWithArguments(item.Text);
                }

    }

Теперь перехожу к последней задаче - упаковка выбранных файлов в архив GZIP. Вот, вроде как, нашел материал по нему:
http://msdn.microsoft.com/ru-ru/library/system.io.compression.gzipstream.aspx

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

Сразу появился вопрос:
Как лучше сделать? Не давать пользователю возможности предварительного просмотра выбранных для упаковки файлов, или все же перед самой упаковкой выводить список из них в какое-то дополнительное поле??
« Последнее редактирование: 05-12-2009 08:28 от Sel » Записан
Страниц: 1 2 [3]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines