Программирование Файловые системы Библиотека FatFS: f_lseek Wed, October 18 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Библиотека FatFS: f_lseek Печать
Добавил(а) microsin   

f_lseek

Функция f_lseek перемещает по файлу указатель позиции чтения/записи. Эту возможность используют для позиционирования на нужные данные в файле, а также для увеличения размера файла (предварительного выделения кластеров для файла).
FRESULT f_lseek (
  FIL* FileObject,   /* Указатель на структуру файлового объекта */
  DWORD Offset       /* Смещение по файлу относительно начала в байтах */
);

Параметры

FileObject
Указатель на открытый файловый объект.
Offset
Количество байт относительно начала файла.

Возвращаемые значения

FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

Описание

Функция 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) */

См. также

f_open, f_truncate, FIL

[Ссылки]

1. f_lseek - перемещение позиции чтения/записи по файлу, увеличение размера файла (оригинал статьи на английском языке).

 

Добавить комментарий


Защитный код
Обновить

Top of Page