Перейти к содержанию
    

fat_fs запись в два файла

Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.

 

1) сколько места выделяется при открытии файла fat_fs?

2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,)

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.

 

1) сколько места выделяется при открытии файла fat_fs?

2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,)

Используйте средства синхронизации (атомарного доступа) этой библиотеки.

 

У меня в ffconf.h так написано, работаю с FreeRTOS

#define FF_FS_REENTRANT    1
#define FF_FS_TIMEOUT    1000
#define FF_SYNC_t        SemaphoreHandle_t

Это гарантирует безопасную многопоточную работую с файловой системой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) сколько места выделяется при открытии файла fat_fs?

брр, все время было равно sizeof( FIL )

 

 

2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,)

Открыл для чтения в FIL fil_r, а для записи в FIL fil_w

//------------------------------------------------------------------------------
FRESULT copy( const TCHAR* path_src, const TCHAR* path_dst, data_storage_file_copy_cb cb, UINT* bytes_written )
{
FRESULT ret = FR_INT_ERR;

FIL* fil_src = (FIL*)MALLOC( sizeof( FIL ) );
FIL* fil_dst = (FIL*)MALLOC( sizeof( FIL ) );
char* buff = (char*)MALLOC( 512 );
bool file_src_open = false;
bool file_dst_open = false;
FRESULT res_src;
FRESULT res_dst;
UINT cnt = 0, cnt_total = 0;

if( ( fil_src == NULL ) || ( fil_dst == NULL ) || ( buff == NULL ) )
{
	ret = FR_INT_ERR;
	goto copy_exit;
}

res_src = f_open( fil_src, path_src, FA_READ );

if( res_src != FR_OK )
{
	ret = FR_NO_FILE;
	goto copy_exit;
}

file_src_open = true;

res_dst = f_open( fil_dst, path_dst, FA_WRITE + FA_CREATE_ALWAYS );
if( res_dst != FR_OK )
{
	ret = FR_NO_FILE;
	goto copy_exit;
}

file_dst_open = true;

cnt_total = f_size( fil_src );

while( 1 )
{
	UINT br, bw;
	res_src = f_read( fil_src, buff, 512, &br );	// Read a chunk of source file
	if( res_src != FR_OK )
	{
		ASSERT( 0 );
		break;
	}

	if( br == 0 )
	{
		ret = FR_OK;
		break; // error or eof
	}

	res_dst = f_write( fil_dst, buff, br, &bw );	// Write it to the destination file

	cnt += bw;

	if( cb )
		cb( cnt, cnt_total );

	if( ( res_dst != FR_OK ) || ( bw < br ) )
	{
		ASSERT( 0 );
		break; // error or disk full
	}
}

copy_exit:
if( file_src_open )
{
	res_src = f_close( fil_src );
	ASSERT( res_src == FR_OK );
}

if( file_dst_open )
{
	res_dst = f_close( fil_dst );
	ASSERT( res_dst == FR_OK );
}

if( buff	) FREE( buff	);
if( fil_src ) FREE( fil_src );
if( fil_dst ) FREE( fil_dst );

if( bytes_written )
	*bytes_written = cnt;

return ret;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

брр, все время было равно sizeof( FIL )

Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ?

Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим. Это я примерно рассматриваю случай если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно, т.е в данном случае один файл должен начинаться где-то с нулевого адреса, а второй файл где-то с середины(так?), но так как размеры изначально неизвестны, то как их расположит файловая система ?

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим.

Почитайте, как устроен FAT. Нет в нем такого понятия, как "расстояние" между файлами. При одновременной записи они просто будут фрагментированы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ?

это вы сказали, я же ответил на ваш вопрос. Можно открыть и гиг, 512 бай это временный буфер для ускорения работы

 

 

если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно

 

создавайте и пишите, проблем быть не должно, возможна лишь только повышенная фрагментация

но можно попробовать использовать expand

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о как их расположит файловая система ?

Как я понимаю, ФС это что-то вроде связанного списка. А списку не нужно линейное неразрывное пространство для хранения данных. Теперь я понял ваш вопрос. Я думал, вам нужна потокобезопасная одновременная запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...