Файлы - чтение и запись в файлы (win api)
Итак, чтение и запись в файлы на win api, производится функциями ReadFile и WriteFile, я опишу их поочереди, и вконце
приведу пример полной программы, которая читает/записывает в файл.
Функция
ReadFile(
hFile : cardinal,
var buffer,
nNumberOfBytesToRead : cardinal,
var lpNumberOfBytesRead : cardinal,
lpOverlapped : POVERLAPPED
) : boolean;
считывает из файла hFile в буфер buffer, lpNumberOfBytesRead байтов, при этом возвращает в переменную
lpNumberOfBytesRead сколько было ДЕЙСТВИТЕЛЬНО прочитано. Последним параметром указываем на структуру OVERLAPPED, обычно ставим nil, он нужен
если файл с которым мы работаем был создан с флагом FILE_FLAG_OVERLAPPED. Теперь про функцию
WriteFile(
hFile : cardinal,
var buffer,
nNumberOfBytesToWrite : cardinal,
var lpNumberOfBytesWritten : cardinal,
lpOverlapped : POVERLAPPED
) : boolean;
она считывает в файл, hFile из буфера nNumberOfBytesToWrite байт, возвращает в переменную lpNumberOfBytesWritten сколько действительно удалось
записать. М последним параметром идёт указатель на структуру OVERLAPPED.
Должен заметить что данные функции работают на порядок быстрее чем встроенные в delphi blockread и blockwrite, чтобы это понять
достаточно запомнить что, blockread и blockwrite - это макро, использующие опять-таки те же самые апи функции
ReadFile и WriteFile, достаточно взглянуть в исходник, и всё сразу становится понятно, я не знаю о чём думают
спецы в компании borland, но явно не об небольшом размере и скорости. А жаль.
Ну да ладно, что-то я отвлёкся, и так, приведу пример:
Листинг 1.0 - чтение-запись файла.
исходник |
program ReadWrite;
uses
Windows;
var
flr,flw : hFile;
buf : array[0..10] of byte;
rdd, wtd : cardinal;
begin
flr := CreateFile('toread.txt',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
flw := CreateFile('towrite.txt',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL, 0);
ReadFile(flr, buf, 11, rdd, nil);
WriteFile(flw, buf, 11, wtd, nil);
CloseHandle(flr);
CloseHandle(flw);
end.
|
Итак, в примере мы затратили всего две строчки, для чтения и записи - всё остальное ушло на "подготовку" - открытие и содание файлов.
Если не можешь понять что за бред написан ниже или выше ReadFile и WriteFile, тогда посылаю тебя прямиком сюда,
изучать открытие-закрытие файлов. Ну а мы двигаемся дальше. В примере, я создал/открыл файл для записи и открыл файл для чтения (понятно, что создавать его
нельзя - надо же откуда-то читать то, что будем записывать) так что откопай у себя какойнть файл, переименуй в toread.txt, и засунь в папку с программой (ну или
полный путь к файлу укажи). Далее я прочитал из файла flr в буфер buf 11 байт, сколько реально прочитано вернул в rdd, ну и последний параметр
не нужен, поэтому устанавливаем его в nil.
Запись производится аналогично, поэтому оставим её на домашнее задание =).
SLAyer
Другие статьи
По всем вопросам и предложениям по сайту пишите на info@comp-info.ru  
|