Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

FatFS - изменить размер файла?

Непрочитано 22.01.2013, 13:40  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию 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..
Реклама:
whoim вне форума  
Непрочитано 22.01.2013, 13:59  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

FA_WRITE | FA_READ надо чтобы и читать и писать. Для уменьшения размера файла есть функция f_truncate().
realid вне форума  
Сказали "Спасибо" realid
whoim (22.01.2013)
Непрочитано 22.01.2013, 14:11  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Сообщение от realid Посмотреть сообщение
FA_WRITE | FA_READ надо чтобы и читать и писать. Для уменьшения размера файла есть функция f_truncate().
Да, спасиб, уже разобрался с обоими вопросами
f_truncate в ff.c и ff.h можно переместить туда, где она будет видна и при minimize=2 (перед f_lseek я поставил)

Тогда и размер почти прежний, и работает
whoim вне форума  
Непрочитано 22.01.2013, 14:24  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию 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);
whoim вне форума  
Непрочитано 23.01.2013, 09:55  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Судя вот по этому,

uint8_t _pos_read;
uint8_t _pos_write = 0;

максимальная длина файла-255+110 = 365 байт;
Так может сразу считать весь файл, урезать и записать.
Boba_spb вне форума  
Непрочитано 23.01.2013, 09:59  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Boba_spb, меткий глаз) Искал этот глюк минут 5, нашел во время отладки)
на тестах файл был маненький, по размеру блока в 5 байт видно )
whoim вне форума  
Непрочитано 23.01.2013, 10:05  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию 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);
Boba_spb вне форума  
Непрочитано 23.01.2013, 10:16  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Вообще то гонять файл - это баловство.
Лучше иметь в нем указатель писателя и читателя.
Когда читатель дочитал до конца - оба указателя в 0.
Если читатель не будет успевать, то ограничить длину файла.
Boba_spb вне форума  
Непрочитано 23.01.2013, 10:19  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Сообщение от Boba_spb Посмотреть сообщение
Когда читатель дочитал до конца - оба указателя в 0
а если не хочется привязываться к размеру файла, а хочется писать пока нет связи хоть десять мегабайт? (на неделю)
whoim вне форума  
Непрочитано 23.01.2013, 10:21  
whoim
Почётный гражданин KAZUS.RUN
 
Аватар для whoim
 
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,618
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
whoim на пути к лучшему
По умолчанию Re: FatFS - изменить размер файла?

Сообщение от Boba_spb Посмотреть сообщение
Так может сразу считать весь файл, урезать и записать
ну тогда у нас размер буфера должен быть по размеру файла то?
много получается
whoim вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить размер платы в P-cad2006? Mike121234 Proteus, KiCAD и другие ECAD 8 16.12.2012 01:27
FatFs Generic FAT File System Module + PIC32 AlexBel Микроконтроллеры, АЦП, память и т.д 5 16.08.2011 22:46
размер рабочего поля sergxxx Микроконтроллеры, АЦП, память и т.д 5 22.07.2008 11:10
Размер функций в Hi-Tech C? stri Микроконтроллеры, АЦП, память и т.д 7 29.12.2007 15:49


Часовой пояс GMT +4, время: 04:47.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.