Здравствуйте! На данный момент в Visual C++ 2019 я пишу программу, которая сравнивает файлы по содержимому (“diff”), и мне нужно сделать предыдущее и следующее сравнение, как в Total Commander, чтобы было поблочно.
Я создал обработку нажатия кнопки “Сравнить”, чтобы выводились отличия и сходства, а вот как сделать поблочно?
Вот обработка кнопки “Сравнить”. На основе её, как понимаю, можно создать обработки предыдущего и следующего сравнения?
//Обработка нажатия кнопки "Сравнить":
if (lParam == (LPARAM)m_hBtnCompare->m_hWnd) {
for (int i = 0; i < NUM_OF_FILES; i++) {
arrayOfFiles[i].fileOpen.getFilePath();
}
if (m_text.PrepareBufferToPaint(arrayOfFiles, NUM_OF_FILES))
{
for (int i = 0; i < NUM_OF_FILES; i++) {
arrayOfFiles[i].fileOpen.m_scrollbar->top();
}
m_countOfLines = 0;
long long tempPos = CPainter::GetMaxScrollPos(arrayOfFiles, NUM_OF_FILES);
tempPos = tempPos - MAX_COUNT_OF_LINES(m_Height) + 2;
for (int i = 0; i < NUM_OF_FILES; i++) {
arrayOfFiles[i].fileOpen.m_scrollbar->setRange(0, tempPos);
}
m_text.m_toDraw = true;
InvalidateRect(m_hWnd, NULL, true);
SetFocus(m_hWnd);
}
}
Сама обработка нажатия кнопки “Сравнить” нужна для вывода адреса, hex-значения побайтово и сам текст, где красным цветом я выделил отличия, а чёрным - сходства. Это я всё вывел в своей программе.
А поблочное сравнение - это такое сравнение, где при нажатии на кнопку нужно найти ближайший блок, который во втором файле отличается от первого (то есть, идёт, например, первый байт схожий в строке из восьми, а уже второй, например, отличный от того, что есть в первом файле). Соответственно, “следующее сравнение” ищет такой блок с отличиями “сверху вниз”, а “предыдущее” - “снизу вверх”, как в Total Commander.
В смысле какая основная задача вообще, что за программа и текст.
Может тут не целый алгоритм диффанья любых текстов нужен, а что-то более простое, типа искать блок по каким-то признакам.
Код выше странный, там в основном про какие-то скроллбары, непонятно как вообще относящиеся к этому ) Надо отделить логику алгоритма от GUI, например, сделать функцию, которая принимает две строки (или два массива строк) и возвращает дифф в нужном виде.
И внутри что-то типа этого алгоритма Longest common subsequence problem - Wikipedia diff - Wikipedia
Ну и GUI на чистом WinAPI в 2021 году мало кто делает )
Хорошо, я понял, в принципе, я просто думал, что, может быть, на основании нажатия кнопки “Сравнить” сделать действия и для поиска блока по отличиям второго файла от первого.
Наверное, чтобы было всё более очевидно: программа, которую я сделал на данный момент. CopyFilesComparsion++.zip (1.2 МБ)