Нашли опечатку?
Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.
|
Библиотека FatFS: f_lseek |
|
Добавил(а) microsin
|
f_lseek
Функция f_lseek перемещает по файлу указатель позиции чтения/записи. Эту возможность используют для позиционирования на нужные данные в файле, а также для увеличения размера файла (предварительного выделения кластеров для файла).
FRESULT f_lseek (
FIL* FileObject, /* Указатель на структуру файлового объекта */
DWORD Offset /* Смещение по файлу относительно начала в байтах */
);
Параметры
- FileObject
- Указатель на открытый файловый объект.
- Offset
- Количество байт относительно начала файла.
Описание
Функция f_lseek перемещает позицию чтения/записи по открытому файлу. Смещение можно указать только относительно начала файла. Когда в режиме записи смещение указано больше, чем размер файла, то размер файла увеличивается до величины смещения, и данные в расширенной области становятся неопределенными. Такой способ хорош для быстрого создания большого файла, чтобы операция записи прошла быстро. После того, как функция f_lseek завершилась, поле fptr файлового объекта должно быть проверено, чтобы убедится, что перемещение позиции произошло корректно. Если окажется, что fptr не равен ожидаемой величине, то произошла одна из следующих ошибок:
- Конец файла (End Of File, EOF). Указанное смещение было уменьшено по размеру файла, потому что файл был открыт в режиме только для чтения (read-only).
- Диск переполнился (Disk full). Недостаточно свободного места на томе, чтобы можно было увеличить размер файла.
Режим быстрого перемещения позиции (fast seek mode) разрешен, когда _USE_FASTSEEK установлено в 1 и поле cltbl в структуре объекта файла не равно NULL. Эта возможность разрешает быструю перемотку назад и дальнее перемещение вперед по файлу без обращения к FAT за счет того, что таблица связи кластеров (cluster 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);
/* Предварительное выделение кластеров (чтобы предотвратить переполнение буфера при потоковой записи) */
res = f_open(file, recfile, FA_CREATE_NEW | FA_WRITE); /* Создание файла */
res = f_lseek(file, PRE_SIZE); /* Предварительное выделение кластеров */
if (res || f_tell(file) != PRE_SIZE) ... /* Проверка - было ли успешным увеличение размера файла */
res = f_lseek(file, DATA_START); /* Запись потока данных без задержек на выделение кластеров */
...
res = f_truncate(file); /* Обрезка неиспользуемого пространства */
res = f_lseek(file, 0); /* Запись заголовка файла */
...
res = f_close(file);
/* Использование возможности быстрого позиционирования (fast seek feature) */
DWORD lktbl[SZ_TBL]; /* Буфер для таблицы связей */
res = f_lseek(file, ofs1); /* Нормальное позиционирование (file.cltbl равен null при открытии файла) */
file.cltbl = lktbl; /* Разрешение fast seek */
lktbl[0] = SZ_TBL; /* Установка размера таблицы в первом элементе массива */
res = f_lseek(file, CREATE_LINKMAP); /* Создание CLMT */
...
res = f_lseek(file, ofs2); /* Быстрое позиционирование fast seek (file.cltbl != NULL) */
[Ссылки]
1. f_lseek - перемещение позиции чтения/записи по файлу, увеличение размера файла (оригинал статьи на английском языке). |
Добавить комментарий
|