С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
Здравствуйте, erslgoeirjh, Вы писали:
E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
CreateFile (WinAPI)
Эта функция предоставляет очень широкий сервис, с ее помощью можно сделать практически все.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, erslgoeirjh, Вы писали:
E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
Удобный и быстрый способ работы с большими (примерно до 2Гб) файлами — это проецирование файлов в память (Memory mapped files).
Удобно тем, что доступ к файлу выглядит так же, как и обращние к памяти. Благодаря этому для операций над содержимым файлов можно даже использовать те функции, которые для этого изначально не предназначались. Кэширование целиком возложено на ОС, что тоже хорошо в плане удобства и скорости.
Соответственно, средства WinAPI — это функции CreateFileMapping, MapVievOfFile.
Здравствуйте, erslgoeirjh, Вы писали:
E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
В WinApi надо ориентироваться на функции с мапированными в память файлами (memory mapped files), такими, как CreateFileMapping, MapViewOfFile(Ex). Их противоположность (закрытие объектов): CloseHandle и UnmapViewOfFile соответственно. Этими функциями можно как читать, так и писать в файлы любого доступного файловой системе размера. Удобство заключается в том, что "смапировав" часть (максимальный размер зависит от ОС) файла в регион памяти, с этим регионом можно работать как с простым набором байтов.
В WinApi есть также функции ReadFile(Ex) и WriteFile(Ex) ими удобно дописывать файл (не надо вызывать SetFilePointer+SetEndOfFile), читать через ReadFile(Ex) менее удобно, чем через мапированный файл, т.к. использование этих функций предполагает наличия буферов для/с данными у вызывающей программы.
ЗЫ Для подробностей можно почитать Рихтера или MSDN.
Re[2]: Как лучше работать с файлами больших объёмов?
> >Этими функциями можно как читать, так и писать в файлы любого доступного файловой системе размера. > > Насколько я знаю, размер успешно отображаемого файла зависит от доступного адресного пространства.
Здравствуйте, erslgoeirjh, Вы писали:
E>С помощью каких средств (MFC или WinAPI) лучше всего считывать информацию из файла (текстового или бинарного) большого объёма? И с помощью каких средств лучше всего создавать такие файлы и записывать туда информацию?
Очень зависит от того, что именно предполагается с этим файлом делать. Если более-менее последовательная запись/чтение — async WriteFile\ReadFile. Если random access в относительно небольшой области — memmaps. Если "совсем" random acess — то лучше всего ReadFile/WriteFile со своей буферизацией.
Это по скорости.
Если главное — удобство — наверное лучше всего memmaps.