Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Cloudo

Просмотр больших файлов в RichEdit (аналог Lister в Total'е)

24.03.2012, 14:58. Показов 1576. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый.
Стоит задача — написать hex differ на чистом winapi на C / C++ (т.е. графическое приложение наподобие опции "Сравнить по содержимому" в Total Commander'е для бинарных файлов). Один нюанс — программа должна работать с большими файлами (> 4 Гб). Выглядеть это должно примерно как во встроенной утилите Lister, встроенной в тот же Тотал (в режиме hex-отображения, конечно). Неважно какого объема файл открываешь — по вертикальному скроллу должна быть возможность попасть в любую часть файла.

Но пока более простая задача — сделать аналог Lister'а.

В качестве графического объекта был выбран RichEdit, т.к. нужно будет подсвечивать различия между файлами другим цветом.
Для подкачки кусков файла использую маппинг — функции CreateFileMapping / MapViewOfFile.

Проблема заключается в том, что я плохо представляю как реализовать незаметную подкачку другого куска (64 кб) и возможность по скроллу перейти в любое место файла.

Правильно ли я представляю, как это будет выглядеть:
1). При загрузке файла вычисляем его размер и выставляем диапазон у скролла RichEdit'а как размер файла / 8, т.к. по 8 байт будет в каждой строке.
2). Устанавливаем для RichEdit-объектов собственную процедуру обработки сообщений, где будем отслеживать скролл-сообщения и заменять подкачанный кусок по необходимости.

Есть сложности в определении этой необходимости. Например, если мы сейчас находимся по смещению FFFE, и спустимся ещё на пару байт вниз, то нужно подкачать следующий кусок файла, но при этом на экране должны остаться байты по смещениям FFF0, например с предыдущего куска.

Предполагаемое решение — памить кусками по 64 кб но по смещениям, не кратным 64 Кб.
Например: в анчале программы загружен кусок 0x0000 — 0xFFFF. Если мы переступаем смещение 0xF000, то грузим кусок 0xE000 — x1DFFF.

3). Маппим первые 64 кбайта файла и отображаем на RichEdit'е.

Второй вопрос — какие примерные действия над самим RichEdit'ом нужно совершать в обработчике скролл-сообщений? Я слабо представляю как связать скролл с диапазоном в весь файл и вывод куска в RichEdit, чтобы это правильно работало.

Cначала делал через ListBox и ручную отрисовку текста. У меня просто подгружался кусок в 64кб, и два листбокса заполнялись 8 (по ширине) на 32 (по высоте) байт. При этом для перехода к следующему 8х32 блоку были обычные кнопки вида "<<" ">>" (была также возможность вбить смещение вручную в edit). При этом новый 64кб кусок подгружался только в случае необходимости.

Но такой вариант не устроил по 3 причинам:
— обязательно нужны скроллы, причем управление должно осуществляться как с клавиатуры, так и мышой (т.е. стрелка вверх / вниз — на одну строку... PageUp / PageDown — по страницам).
— должна быть возможность изменять размер окна (я делал диалогом)
— при перерисовке изображение не должно мерцать (насколько я понимаю если использовать не ручную отрисовку, а предоставить ричедиту отрисовываться самому, такой проблемы не будет... либо же использовать двойную буферизацию, но листбокс всё равно не подходит, т.к. нужна навигация, которую пришлось бы писать самому).


Надеюсь на Вашу помощь.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.03.2012, 14:58
Ответы с готовыми решениями:

Просмотр файла (аналог lister TotalCommander)
Подскажите пожалуйста, 1) возможно ли сделать чтобы из моего приложения все файлы открывались с помощью определенной программы (например...

Просмотр больших файлов
Есть код программы которая открывает большие файлы и позволяет динамически подгружать из них данные при перелистывании using System; ...

Не открывает большие файлы (Аналог lister Total commander )
Задание написать аналог lister (вывод содержимого файла в hex). Но при открытии файлов большого размера все виснет. И еще проблема: ...

1
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
25.03.2012, 22:38
Цитата Сообщение от Cloudo Посмотреть сообщение
1). При загрузке файла вычисляем его размер и выставляем диапазон у скролла RichEdit'а как размер файла / 8, т.к. по 8 байт будет в каждой строке.
обычно по 16 0х10

Цитата Сообщение от Cloudo Посмотреть сообщение
Есть сложности в определении этой необходимости. Например, если мы сейчас находимся по смещению FFFE, и спустимся ещё на пару байт вниз, то нужно подкачать следующий кусок файла, но при этом на экране должны остаться байты по смещениям FFF0, например с предыдущего куска.
можно взять положение скрола от него вычислить смешение и залить заново
самое простое решение но и самое тормозное
считывать предыдущий, текущий и последующий блок (типа кэша)
посмотри на файлы проецируемые в память

Добавлено через 7 минут
Цитата Сообщение от Cloudo Посмотреть сообщение
Один нюанс — программа должна работать с большими файлами (> 4 Гб).
как ты думаешь кто нибудь когда посмотрит этот дамп останется здоров
проще выводить смешение байтов которые разнятся и значения первого и второго
например
0х100 0х00 0х25

и по моему для данных задач RichEdit не подойдет лучше создать свое окно( вот здесь как раз может подойти Документ-Вид)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2012, 22:38
Помогаю со студенческими работами здесь

RichEdit или аналог
Есть выборка из бд, какие то данные нужно перенести в RichEdit c разным цветом шрифта, в зависимости от записи. Если добавлять...

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

Просмотр в режиме реального времени (аналог watch -n 1)
Здравствуйте. Как можно в Powershell просматривать tcp/udp соединения в режиме реального времени? Типа как в Linux выполнить watch -n 1...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru