3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
1 | |
Сравнить два текстовых файла23.09.2010, 01:18. Показов 5784. Ответов 19
Метки нет (Все метки)
Есть 2 текстовых файла (1.txt , 2.txt)
1.txt: C:\Assch C:\boot.ini C:\CONFIG.SYS 2.txt: C:\Assch C:\AUTOEXEC.BAT C:\boot.ini C:\Bootfont.bin C:\CONFIG.SYS C:\IO.SYS Можно ли на ассемблере сделать функцию которая прочитала бы эти 2 файла нашла изменения и создала бы файл 3.txt в котором бы прописала изменения то есть добавленные строчки вот так 3.txt: C:\AUTOEXEC.BAT C:\Bootfont.bin C:\IO.SYS В этих файлах очень мало строк просто для понятия смысла. Функция нужна очень быстрая так как ей придётся сравнивать текстовые файлы где не меньше 20000 строк. Есть програмка кажется DiffText называется она сравнивает, и выдаёт результаты изменения практически мгновенно. Вопрос к знатокам: Можно ли подобную функцию сделать на старом добром ассемлере.
0
|
23.09.2010, 01:18 | |
Ответы с готовыми решениями:
19
Сравнить два числа Сравнить два числа и вывести большее в debug на ассемблере Сравнить два массива и вывести наименьший их них на экран Ввести два символа с клавиатуры и сравнить и вывести символ с большим кодом |
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
|
|
23.09.2010, 09:00 | 2 |
конечно можно, только не думаю что старый добрый ассемблер как то ускорит работу, читать файлы то надо все равно 21h прерыванием(если имеется в виду старый добрый дос)
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
23.09.2010, 14:05 [ТС] | 3 |
Нет Виндовс
Это нужно для того чтобы выявить изменения в файловой системе Делаешь снимок скажем папки Program Files потом ставишь какую нибудь программу Делаешь второй снимок Сравниваешь и получаешь список добавленных файлов как это делает скажем ТоталЮнистал Не поможете?
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
||||||
23.09.2010, 22:35 | 4 | |||||
Начнем с того, что ОС тут не имеет значения. В любой ОСи надо будет сначала загрузить файл в память и там его сравнивать. Загрузка файла вылоняется стандартными для ОСи средствами, на которые мы не можем повлиять. В Windows используется WinAPI. Самая критическая часть - это процедура сравнения.
Написал ее варант. Но работает только при соблюдении нескольких условий. 1) Файлы представляют из себя набор строк, которые заканчиваются CR+LF 2) Кодировка ASCII 3) Учитывая цель задачи, минимальная разница - 1 строка. Даже если внутри строк оличается только одна буква в третьем файле будет целая строка. 4) В конце файлов должен быть CR+LF. То-есть файлы должны заканчиваться пустыми строками. Это можно сделать внутри программы перед вызовом процедуры. 5) Самое главное. Из-за специфики задачи, предполагается, что во втором файле есть все строки первого файла + от нуля до N новых строк.
1
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 01:02 [ТС] | 5 |
Спасибо Orwomoi,
Попробую Добавлено через 6 минут Правда с этим могут быть проблемы Посмотрим Добавлено через 1 час 20 минут Добавлено через 1 минуту Уважаемый Orwomoi Пока разберусь пройдёт время а так хочется попробывать ваш алгоритм в действии. Судя по лёгкости написания кода вы хорошо владеете ассемблером. Сделайте пожалуйста экзешник из этого кода. При нажатии на который если рядом лежат два файла которые нужно сравнивать. Скажем : 1.txt -(Первый файл со старыми строчками) 2.txt -(Второй файл с добавленными строчками) Он бы их обработал и создал бы файл: 3.txt -(Где прописались бы добавленные строчки) Очень хочется попробывать ваш алгоритм. У меня есть один экзешник, я написал его на языке Autoit Который делает такое сравнение скажем папки Program Files В файле 1.txt получается около 15000 строк я уж не говорю сколько получится строк в файле 2.txt Но он затрачивает на это около 5-6 секунд. Повторю, например программа DifText делает это практически мгновенно. Поэтому хочется посмотреть как с этим справится ассемблер. Вам професионалу это наверное будет не трудно, тем более функция уже написана.
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
||||||
24.09.2010, 04:38 | 6 | |||||
Вот код для фасма. Коментариев к новой части нет, потому что это всё WinAPI, который описан в MSDN. В директории с программой должны быть файлы old_file.txt и new_file.txt, после работы появится result_file.txt Проверок на ошибки нет.
1
|
158 / 105 / 6
Регистрация: 22.08.2010
Сообщений: 215
|
|
24.09.2010, 11:20 | 7 |
Я думаю, что имеет, особенно под реальный режим DOS. Если файлы > 1 мегабайта - придется некисло извращаться с чтением то одного то другого файла кусками в память.
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 14:11 [ТС] | 8 |
Спасибо Orwomoi
Попробую сделать правда придётся скачать фасм и поучится с ним работать я раньше имел дело с masm32 с ним я знал как обращатся но попробую справится В любом случае большое спасибо за участие Ещё раз извините этот код я должен скомпилировать в фасме и получится экзешник?
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
||||||
24.09.2010, 14:34 | 9 | |||||
В данном случае код полностью готов для компилирования. Достаточно скопировать в фасм и нажать compile. Ему не нужны ключи коммандной строки. По окончанию выполнения будет exe.
Кстати, насчет скорости исполнения. Добавил подсчет.
1.txt: C:\Assch C:\boot.ini C:\CONFIG.SYS 2.txt: C:\Assch C:\AUTOEXEC.BAT C:\boot.ini C:\Bootfont.bin C:\CONFIG.SYS C:\IO.SYS
1
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 14:56 [ТС] | 10 |
Уважаемый Orwomoi
Прошу прощения за наглость Я так понимаю Фасм у вас под рукой Вы не могли бы скомпилировать у себя этот екзешник и прикрепить его например в архивированном виде в это теме у себя в ответе Я так понимаю он весит не много (чем собственно и славится ассемблер) Просто так будет быстрей пока я скачаю и разберусь с Фасмом Ещё раз прошу прощения за наглость
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
24.09.2010, 15:49 | 11 |
Переименовать в exe.
P.S. Давайте меньше формальностей.
1
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 16:45 [ТС] | 12 |
Orwomoi,
При открывании мои винды выдали сообщение Что можно ли его использовать отсутсвует какая то цифровая подпись я конечно это окно отключил но странно почему И главное почему при работе экзешника открывается чёрное окно командной строки можно ли чтобы он сработал в фоновом режиме без этого чёрного окна А насчёт эфективности на первый взгляд выше всяких похвал Я сравнил файл весом 1.08mb и 1.76mb то есть снимки всего диска С до и после установки программы Pinnacle и она справилась меньше чем за секунду Добавлено через 30 минут Хотя нет не так всё гладко файл отчёта он сделал весом 1.75мб тоесть записал в него не то что именно нужно Буду тестить дальше
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
24.09.2010, 17:23 | 13 |
Не знаю зачем ему нужна цифровая подпись. Это, наврное, параноя Висты или Семерки.
В черном окне консоли выводится кол-во циклов, сколько выполнялась процедура. Сравнить два текстовых файла - вариант без консоли. Прикрепил скомпилированный экзешник. Если result_file такой большой... Возможно в new_file нет какото-то символа\строки из old_file и он посчитал всё остальное новым.
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 18:16 [ТС] | 14 |
За без консольный вариант спасибо
У меня обычная XP И честно говоря самому странно почему такие сообщения ведь этот екзешник не вносит какие то изменения в систему (или я не прав) Обычно эти сообщения винды навязывают когда ставишь какую нибудь не пондравившуюся ей программу (но та то хоть понятно ведь прога пытается записать какие то файлы в систему а здесь почему ?) Буду тестить экзешник Может придётся чуть чуть подравить алгоритм Я собственно говоря работаю с языком Autoit и соответственно у меня есть функция на этом языке. Просто при сравнении списков файлов (до и после) например папки Program Files где в каждом из текстовых файлов больше 15000 строк, эта функция затрачивает около 5-6 секунд (относительно быстро)и она вроде бы правильно отображает результаты. Правда функция требует наличие установленного Фраймвёрка 2 иначе просто выскакивает сообщение об ошибке Не критично но в некоторых случаях не удобно Просто программы подобного рода например DiffText делают это практически мгновенно и без всякого фраемвёрка. Поэтому я и хотел попробывать асемблерную вставку (простой экзешник на ассемблере) Проще говоря хотел сравнить. Ну и ради интереса хотел бы знать какими алгоритмами работают эти программы типа DiffText Кстати этот алгоритм Diff обсуждается по этой ссылке http://ru.wikipedia.org/wiki/Diff Я тоже пытался сделать свою функцию на Atoit Алгоритм там у меня такой: Из двух файлов создаются два масива Потом из первого (старого) масива берётся первая строчка и парсингом ищется во втором масиве как только находит совпадение она удаляет эту строчку из второго масива потом переходит на вторую строчку первого масива и также ищет если не находит то просто переходит на следующую строчку первого масива Тоесть все строчки что были в первом масиве она удаляет во втором масиве ну и остатки второго масива записывает в файл отчёта Работает этот алгоритм безупречно но и соответсвенно долго Скажем если функция с Фраемвёрком 2 это сделает за 5-6 секунд то моей требуется около 2 минут Я понимаю что я может быть делаю что то не так (Знаний пока не хватает) Интересно а мой алгоритм можно перекинуть на ассемблер может быть там он будет работать побыстрее?
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
24.09.2010, 19:38 | 15 |
Никаких изменений в системе нет. Все функции винапи сводятся к открытию файла, чтению\записи, выделение памяти в куче и пауза. В варианте со счетчиком еще установка приоритета трэда.
Инетересно, посмотрим что можно сделать... Такой алгоритм требует много обращений к памяти на удаление\перезапись. Обращение к памяти стоит дорого в плане времени на исполнение. За одно подобное действие можно выполнить 30-50 сложений\вычитаний. По этой причине у меня в процедуре столько жонглирования регистрами: я не хотел делать локальные переменные. На 64битном процессоре с его дополнительными регистрами, можно еще лучше сделать.
1
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 20:12 [ТС] | 16 |
Насчёт моего алгоритма вы правы ,слишком перегружен.
У меня есть исходник программы WinDiff написанный на С. Только как оттуда вытащить эту функцию не знаю.
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
24.09.2010, 20:36 [ТС] | 17 |
Кстати вы наверное знаете что есть командная функция Виндов
fc 1.txt 2.txt >3.txt Она тоже прекрасно и мнгновенно ищет изменения. В файле отчёта она выводит и добавленные строки и удалённые строки. файл отчёта у неё несколько мудрённый, но главное она работает. В принципи не плохо ,создал батник написал там эту команду и всё. Плохо только то что для больших изменений она не подходит файл отчёта она создаёт не больше 64кб (наследие досовских времён)
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
29.09.2010, 04:31 [ТС] | 18 |
Скачал Фасм поставил и хотел скомпилировать ваш скрипт (чтобы поэксперементировать)
но увы Фасм мне выдал ошибку Самое интересное что в папке Фасма лежит папка EXAMPLES в ней примеры так вот я взял самый простой HELLO.ASM рядом с ним был уже откомпилированный экзешник который запускался всё нормально Но когда я этот файл (его родной) ради интереса вставил в Фасм (думая что Фасм не принимает только ваш код) то он тоже не скомпилировал его и выдал туже ошибку Не подскажете почему Скриншот ошибки в файле 1.JPG
0
|
3 / 3 / 0
Регистрация: 13.09.2010
Сообщений: 46
|
|
29.09.2010, 05:10 [ТС] | 19 |
Кажется разобрался
Надо было файл вставить в папку INCLUDE и там с ним работать Как говорится век живи век учись
0
|
0 / 0 / 0
Регистрация: 28.01.2011
Сообщений: 21
|
|
25.12.2011, 13:51 | 20 |
А может кто-нибудь добавить комментарии к этой программе? Хочу в ней разобраться, но без комментариев очень сложно...
0
|
25.12.2011, 13:51 | |
25.12.2011, 13:51 | |
Помогаю со студенческими работами здесь
20
Сравнить поэлементно два массива и записать максимальный элемент из каждой пары в третий массив Эмуляция сравнения двух чисел или как сравнить два qword x32 cmp? Даны два массива. Найти среднее арифметическое элементов каждого и сравнить эти значения Работа с массивами (сравнить два числа) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |