В Total (Windows) Commander есть плагин Lister, который открывает текстовые файлы для просмотра (режим read only), причем за время не более 1-ой секунды!. Особенность его в том, что размер файла не имеет значения - хоть 1 килобайт, хоть 3 _мегабайта_. Вопрос в чем: мне нужно тоже сделать такую штуку: read only-просмотр содержимого файла на форме (например, в TMemo /Borland C++ Builder v 5/). Суть в том, что это должно очень быстро грузиться. Естественно, стандартным LoadFromFile тут не обойтись. Помогите, пожалуйста (может, кто сталкивался с такой задачей - может есть исходники)..
Добрый день, Alexey! Копай MSDN в сторону File Mapping. Ответ отправлен: 14.05.2004, 09:47 Отправитель: Gibbel Отвечает Pawel
Приветствую Вас, Alexey! Читаются первые N символов которые влазят в экран. Далее при прокрутке данные дочитываются. Ответ отправлен: 15.05.2004, 20:55 Отправитель: Pawel Отвечает Foamplast
Приветствую Вас, Alexey!
Есть такой метод: отображение файлов на память. То есть программа делает соответствующие вызовы, и после этого некоторая порция адресного пространства программы начинает соответствовать указанному файлу. Положим, отображение начинается с адреса 100, тогда чтение из памяти по адресу [102] равносильно чтению из файла по смещению 2. А запись в память по адресу [211] равносильно записи в файл по смещению 111.
на диске
...
bigfile.dat
...
a
x
0
30
в памяти
...
code
data
...
mapping area
...
a
x
40000
50000
60000
60030
Вся прелесть этого метода состоит в том, что
операционная система делает всю работу по чтению/записи в файл. То есть программист может сосредоточиться на более высокоуровневых задачах. Например, при чтении из 60-го мегабайта файла система просто загрузит страницу памяти данными из соответствующей области файла. При этом реально передано будет немного даных (скорее всего, около 4Кб). Для использования отображения на память в Windows используются следующие функции:
CreateFile()
- открывает файл для чтения/записи
CreateFileMapping()
- создаёт объект "отображённый на память файл"
MapViewOfFile()
- отображает заданный участок файла на память
UnmapViewOfFile()
- прекращает отображение участка файла на память
CloseHandle()
- закрывает объект "отображённый на память файл"
CloseHandle()
- закрывает файл
Слова "отображает заданный участок" в описании MapViewOfFile() не случайны. При вызове этой функции указывается, что, например, отображать стоит только участок с 6291456-го байта по 7528448-й. Естественно, значения начала и конца отображения должны быть кратны размеру блока памяти в системе, который можно узнать с помощью GetSystemInfo().
Возвращаясь
к нашим (точнее, Вашим) баранам, хочу сказать, что имеет смысл использовать именно этот метод. Только что открыл файл в 690 Мб за полсекунды. Прикол в том, что программа реально обращалась к первым 512 байтам. Но отображала весь файл! То есть чтение из конца этого файла займёт, наверное, тоже немного. Проверьте это.
Только что отладил Windows Commander. Нифига он не использует отображение на память! Он просто читает файл блоками ~32 Кбайт. Когда подходит конец блока, он читает следующий. То есть для реализации этого метода необходимо всего два буфера. В одном хранится то, что показывается, а в другом - что покажется следующим (при достижении границы). Конечно же, при изменении направления движения необходимо перезагрузить "предварительный" буфер. В целом, это и есть работа ОС при последовательном чтении отображённой на файл памяти.
:)
Вывод: отображение файлов целиком проще, но при "обычном" чтении задержка меньше.
Ответ отправлен: 16.05.2004, 02:03 Отправитель: Foamplast
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.