Запись в файлы и чтение из них
В этом разделе рассматривается: fd.getdata, fd.setdata, fd.pointer, fd.setpointer, fd.filesize.
Запись в файлы и чтение из них - две важнейшие файловые операции. Без них флеш-диск был бы бессмысленным. Запись и чтение выполняются двумя методами - fd.setdata и fd.getdata соответственно. Чтобы они работали, файл сначала нужно открыть. Методы fd.setdata и fd.getdata работают с текущим выбранным файлом, выбор делается через свойство fd.filenum.
Указатель
И чтение, и запись всегда выполняются с текущей позиции указателя. Эту позицию можно проверить через свойство fd.pointer (только чтение) и изменить методом fd.setpointer. Выполнение fd.setdata или fd.getdata сдвигает указатель вперёд на число записанных или прочитанных позиций файла.
Указатель всегда указывает на позицию (смещение) в файле, с которой будет выполняться следующее чтение или запись. Смещения в файле отсчитываются с единицы, а не с нуля. Самый первый байт файла находится по смещению один, следующий - по смещению два и так далее. Самый последний байт файла находится по смещению, равному размеру файла, который показывает свойство fd.filesize (только чтение). Однако максимальное значение указателя - fd.filesize + 1! Когда указатель имеет максимальное значение, он фактически указывает на позицию файла, которой ещё нет. Поэтому запись в файл с этой позиции добавляет новые данные в конец файла. Запись, когда указатель не на максимуме, перезаписывает существующие данные.
При открытии файла указатель устанавливается в 1, если в файле есть данные (fd.filesize <> 0), или в 0, если файл пуст (fd.filesize = 0). Установить указатель в ноль, если файл не пуст, нельзя. Указатель сдвигается автоматически, если файл уменьшается, и устанавливается в ноль, если файл становится пустым.
Запись и чтение
В следующем примере мы добавляем данные в конец файла, а затем читаем данные с начала файла:
Dim s As String
'open a file 'on' file number 3
fd.filenum=3
fd.open("SomeFile")
fd.setpointer(fd.filesize+1) 'works always -- no matter whether the file is empty or not
fd.setdata("Append this to the file")
fd.setpointer(1) 'go back to the beginning of the file
s=fd.getdata(10) 'read 10 bytes from the beginning of the file
Если fd.setdata выполняется, когда указатель не в конце файла (не на позиции fd.filesize + 1), часть существующих данных файла будет частично перезаписана. Если указатель выходит за текущий размер файла (fd.filesize), размер увеличивается автоматически. По мере добавления новых данных файл растёт. Новые секторы данных выделяются и добавляются к файлу автоматически по мере необходимости. Если на диске закончились свободные секторы, будет выдана ошибка 7 - PL_FD_STATUS_DATA_FULL. Если при выполнении fd.setdata обнаружено, что диск заполнен, в файл не сохраняется вся строка данных, переданная в fd.setdata (а не только та часть, которая не поместилась).
Метод fd.setdata изменяет секторы флеш-диска. Для максимальной надёжности вызывайте этот метод в рамках дисковых транзакций.
Кэширование данных файла
Объект fd. использует буфер ОЗУ №1 как промежуточное хранилище данных сектора. При обращении к некоторому сектору данных его содержимое загружается в буфер ОЗУ №1. Когда вы изменяете данные в секторе, изменяются данные в буфере ОЗУ. Изменённое содержимое буфера ОЗУ не сохраняется обратно во флеш-память, пока в буфер не потребуется загрузить содержимое другого сектора. Так, например, если вы выполните это ...
fd.setdata("Write this to a file")
... а затем не будете обращаться к диску, новые данные могут оставаться в буфере ОЗУ неопределённо долго. Они могут пропасть, например, при перезагрузке устройства. Чтобы этого избежать, закройте файл или вызовите метод fd.flush - любое из этих действий приведёт к сохранению изменённых данных из буфера ОЗУ обратно во флеш-память. Учтите, что метод fd.flush не зависит от текущего значения fd.filenum и действует глобально на самый последний изменённый файл.
Использовать fd.flush не нужно, если дисковые операции выполняются в рамках дисковой транзакции.