|
|
  |
FAT как дописывать файлы? |
|
|
|
Mar 14 2011, 11:46
|
Частый гость
 
Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335

|
Добрый день, Господа!
Пишу на АРМ под Си. Работаю с SD-картой и файловой системой FAT. Задача подразумевает запись файлов большого размера 1ГБ и более до 2ГБ. Существует проблема, что если при записи файла произойдет сбой (выключение питания и т.д) до закрытия файла, все данные потеряются. Каким-нибудь образом можно решить задачу, например закрыть файл после очередного цикла записи, а потом заново открыть и дописать? Нашел функцию f_sync, которая как бы подобна функции f_close, но при этом файл можно дозаписывать, но f_sync работает ужасно медленно. В цикле без f_sync запись происходит на скорости 20Mbit/s, а с ней скорость падает на порядок. Как можно решить эту проблему?
|
|
|
|
|
Mar 14 2011, 17:23
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073

|
Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости.
|
|
|
|
|
Mar 14 2011, 19:41
|
Частый гость
 
Группа: Участник
Сообщений: 109
Регистрация: 19-01-11
Пользователь №: 62 335

|
Блоки точно по 32КБ. Цитата Имхо, с фат-ом проблема состоит в том, что саму таблицу размещения надо постоянно сохранять. Возможно в этом и причина сильного падения скорости. Для akimych, можно поподробнее?
|
|
|
|
|
Mar 15 2011, 06:04
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203

|
При использовании f_sync перезаписывается таблица каталога (сохраняется новый размер и дата изменения файла). Так же если стоит FAT32 при f_sync может еще переписывается загрузочная запись раздела, если она была изменена.
При записи файла информация на диск записывается порциями равными размеру сектора (параметр _MAX_SS). Может быть несколько буферов в зависимости от настроек (см _FS_MINIMIZE). Один для внутренних структур ФС и по одному на каждый открытый файл. Это в лучшем случаи, если стоит минимизация ФС, то один буфер на все нужды. Так вот если для каждого файла есть свой буфер его размер равен размеру сектора и как только этот буфер заполняется он переписывается на носитель. Также меняется сама таблица фат. Таким образом f_sync только перезаписывает таблицу каталога.
Сообщение отредактировал yashok - Mar 15 2011, 06:05
|
|
|
|
|
Mar 15 2011, 07:52
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203

|
Да вроде не должно из-за f_sync так скорость падать.
|
|
|
|
|
Mar 15 2011, 18:38
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073

|
Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет?
|
|
|
|
|
Mar 16 2011, 04:43
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203

|
Цитата Какой смысл f_sync сохранять только каталог и не сохранять таблицу размещения, кто тогда таблицу размещения сохраняет? Она сохраняется когда идет непосредственная запись файла. Когда требуется при записи переходить в новый кластер, ищется свободный кластер и в цепочку кластеров для данного файла в таблице FAT добавляется номер этого кластер.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|