FatFS - изменить размер файла?
22.01.2013, 13:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
FatFS - изменить размер файла?
Нужно в минимальной "комплектации"
|
Цитата:
|
#define _FS_MINIMIZE 2 /* 0 to 3 */
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
/
/ 0: Full function.
/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename
/ are removed.
/ 2: f_opendir and f_readdir are removed in addition to 1.
/ 3: f_lseek is removed in addition to 2. */
|
сделать следующее:
1) прочитать с начала файла до разделителя (\r) в буфер
2) перенести поблочно (файл может быть большой) данные (сместить) так, чтобы перезаписать то что вытащили в шаге 1
3) уменьшить размер файла на длинну того, что вытащили в п. 1
в итоге - буфер. Пишем в него, читаем сначала смещая. Так сказать, файловое фифо.
Пункты 1 и 2 реализовал. Третий пытался так:
|
Код:
|
fil_obj.fsize -= strlen(_str_buff); //изменим размер файла на новый
f_err_code = f_write(&fil_obj, 0, 0, &ByteCount); //запишем null для принятия изменений
if(f_err_code != 0x00) rs485_send_str("filesize error\r\n"); |
не прокатило. Это вообще реально?
Еще вопрос: почему я должен переоткрывать каждый раз файл для чтения и для записи, в зависимости от того что мне надо? Если я открываю как FA_WRITE, то f_read всегда возвращает ошибку 7..
|
|
|
|
22.01.2013, 13:59
|
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
|
Re: FatFS - изменить размер файла?
FA_WRITE | FA_READ надо чтобы и читать и писать. Для уменьшения размера файла есть функция f_truncate().
|
|
|
|
22.01.2013, 14:11
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Да, спасиб, уже разобрался с обоими вопросами 
f_truncate в ff.c и ff.h можно переместить туда, где она будет видна и при minimize=2 (перед f_lseek я поставил)
Тогда и размер почти прежний, и работает
|
|
|
|
22.01.2013, 14:24
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: FatFS - изменить размер файла?
пока вышло как то так. Позже вернусь, переосмыслю - чонить оптимизирую
|
Код:
|
//сдвинем данные в файле
uint8_t _pos_read;
_pos_read = strlen(_str_buff); //позиция для считывания
uint8_t _pos_write = 0; //позиция для записи
uint8_t _bytes_for_write = 0; //число байт для записи
do
{
f_lseek(&fil_obj, _pos_read); //переместимся на позицию для чтения
f_err_code = f_read(&fil_obj, _buff, 110, &ByteCount); //читаем
if(f_err_code != 0x00) rs485_send_str("read error\r\n");
_bytes_for_write = ByteCount; //сохраним колво байт для записи
f_lseek(&fil_obj, _pos_write); //переместимся в позицию для записи
f_err_code = f_write(&fil_obj, _buff, _bytes_for_write, &ByteCount); //запишем
if(f_err_code != 0x00) rs485_send_str("write error\r\n");
_pos_read += _bytes_for_write; //рассчитаем новую позицию чтения
_pos_write += _bytes_for_write; //рассчитаем новую позицию для записи
} while (_bytes_for_write != 0); //пока есть что читать
f_lseek(&fil_obj, fil_obj.fsize - strlen(_str_buff)); //изменим размер файла на новый
f_truncate(&fil_obj); |
|
|
|
|
23.01.2013, 09:55
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Судя вот по этому,
uint8_t _pos_read;
uint8_t _pos_write = 0;
максимальная длина файла-255+110 = 365 байт;
Так может сразу считать весь файл, урезать и записать.
|
|
|
|
23.01.2013, 09:59
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Boba_spb, меткий глаз) Искал этот глюк минут 5, нашел во время отладки)
на тестах файл был маненький, по размеру блока в 5 байт видно )
|
|
|
|
23.01.2013, 10:05
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Что то типа этого
f_read( File, Buff, sizeof(Buff), &cnt );
for( int i=0; i ‹ cnt; i++ )
{
if( Buff[i] != '\r' ) continue;
f_lseek( File, 0 );
f_write(File, &Buff[ i+1 ], cnt - i -1, &cnt );
break;
}
f_truncate(File);
|
|
|
|
23.01.2013, 10:16
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Вообще то гонять файл - это баловство.
Лучше иметь в нем указатель писателя и читателя.
Когда читатель дочитал до конца - оба указателя в 0.
Если читатель не будет успевать, то ограничить длину файла.
|
|
|
|
23.01.2013, 10:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Сообщение от Boba_spb
|
|
Когда читатель дочитал до конца - оба указателя в 0
|
а если не хочется привязываться к размеру файла, а хочется писать пока нет связи хоть десять мегабайт? (на неделю)
|
|
|
|
23.01.2013, 10:21
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: FatFS - изменить размер файла?
Сообщение от Boba_spb
|
|
Так может сразу считать весь файл, урезать и записать
|
ну тогда у нас размер буфера должен быть по размеру файла то?
много получается
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:47.
|
|