Библиотека FatFS: f_lseek |
Добавил(а) microsin |
f_lseek Функция f_lseek перемещает по файлу указатель позиции чтения/записи. Эту возможность используют для позиционирования на нужные данные в файле, а также для увеличения размера файла (предварительного выделения кластеров для файла).
FRESULT f_lseek ( FIL* FileObject, /* Указатель на структуру файлового объекта */ DWORD Offset /* Смещение по файлу относительно начала в байтах */ ); Параметры
Возвращаемые значения FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT Описание Функция f_lseek перемещает позицию чтения/записи по открытому файлу. Смещение можно указать только относительно начала файла. Когда в режиме записи смещение указано больше, чем размер файла, то размер файла увеличивается до величины смещения, и данные в расширенной области становятся неопределенными. Такой способ хорош для быстрого создания большого файла, чтобы операция записи прошла быстро. После того, как функция f_lseek завершилась, поле fptr файлового объекта должно быть проверено, чтобы убедится, что перемещение позиции произошло корректно. Если окажется, что fptr не равен ожидаемой величине, то произошла одна из следующих ошибок:
Режим быстрого перемещения позиции (fast seek mode) разрешен, когда _USE_FASTSEEK установлено в 1 и поле cltbl в структуре объекта файла не равно NULL. Эта возможность разрешает быструю перемотку назад и дальнее перемещение вперед по файлу без обращения к FAT за счет того, что таблица связи кластеров (custer link map table, CLMT) сохраняется в таблице, заданной пользователем. Эта возможность также влияет на работу функций f_read/f_write. В этом режиме размер файла не может быть увеличен функциями f_write/f_lseek. Таблица CLMT должна быть создана в определенном пользователем массиве DWORD до использования возможности fast seek. Чтобы создать CLMT, установите указатель на массив DWORD в поле cltblструктуры файлового объекта, установите размер массива в юнитах элементов первого эдемента и вызовите функцию f_lseek с параметром Offset = CREATE_LINKMAP. После завершения функции и создания CLMT, к FAT не будет осуществляться доступ при доступе к файлу в последующих вызовах функций f_read/f_write/f_lseek. Если функция завершится с ошибкой FR_NOT_ENOUGH_CORE, указанный размер массива недостаточен для файла и требуемое количество элементов будет возвращено в первом элементе массива. Требуемый размер массива равен (количество_фрагментов_файла + 1) * 2 элементов. Например, когда в файле 5 фрагментов, то для CLMT требуется 12 элементов массива. Краткая информация (QuickInfo) Функция доступна, когда _FS_MINIMIZE <= 2="" --="--"> Пример кода /* Открытие файла */ file = malloc(sizeof(FIL)); if (!file) ... res = f_open(file, "file.dat", FA_READ|FA_WRITE); if (res) ... /* Перемещение позиции на смещение 5000 байт от начала файла */ res = f_lseek(file, 5000); /* Перемещение в конец файла для добавления новых данных */ res = f_lseek(file, f_size(file)); /* Перемещение вперед еще на 3000 байта */ res = f_lseek(file, f_tell(file) + 3000); /* Перемотка назад на 2000 байта (будьте внимательны во избежание переполнения) */ res = f_lseek(file, f_tell(file) - 2000); /* Предварительное выделение кластеров (чтобы предотвратить переполнение буфера /* Использование возможности быстрого позиционирования (fast seek feature) */ DWORD lktbl[SZ_TBL]; /* Буфер для таблицы связей */ res = f_lseek(file, ofs1); /* Нормальное позиционирование (file.cltbl См. также [Ссылки] 1. f_lseek - перемещение позиции чтения/записи по файлу, увеличение размера файла (оригинал статьи на английском языке). |