Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: fat_fs запись в два файла
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
pokk
Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.

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


haker_fox
QUOTE (pokk @ Feb 20 2018, 14:52) *
Добрый день, понадобилось записывать сразу в два файла, решил протестировать, сделал открытие файла1 с один указателем и следом открытие файла 2 с другим указателем, потом вызвал функцию запись в один файл и в другой, закрыл оба файла, все записалось как и планировал. Но теперь думаю что это все не правильно делал, так как в процессе записи файл1 может залезть на файл2.

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

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

У меня в ffconf.h так написано, работаю с FreeRTOS
CODE
#define FF_FS_REENTRANT    1
#define FF_FS_TIMEOUT    1000
#define FF_SYNC_t        SemaphoreHandle_t

Это гарантирует безопасную многопоточную работую с файловой системой.
megajohn
Цитата(pokk @ Feb 20 2018, 09:52) *
1) сколько места выделяется при открытии файла fat_fs?

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


Цитата(pokk @ Feb 20 2018, 09:52) *
2) как правильно записывать несколько файлов ?(открыл файл 1 записал закрыл, открыл файл 2 записал закрыл,)

Открыл для чтения в FIL fil_r, а для записи в FIL fil_w
CODE
//------------------------------------------------------------------------------
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;
}
pokk
Цитата(megajohn @ Feb 20 2018, 10:44) *
брр, все время было равно sizeof( FIL )

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



aaarrr
Цитата(pokk @ Feb 20 2018, 11:19) *
Возможно я не правильно выразился, меня интересует, если открыть два файла за запись, то сколько между ними будет расстояние в байтах, и вообще fat_fs следит ли за этим.

Почитайте, как устроен FAT. Нет в нем такого понятия, как "расстояние" между файлами. При одновременной записи они просто будут фрагментированы.
megajohn
Цитата(pokk @ Feb 20 2018, 11:19) *
Хотите сказать что больше чем чуть больше чем 512 байт файл не может быть ?

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


Цитата(pokk @ Feb 20 2018, 11:19) *
если на SD карту размеров 1гиг писать, надо записать два файла чуть меньше 500 Mб что бы влазили на карту, причем запись их идет одновременно


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


haker_fox
QUOTE (pokk @ Feb 20 2018, 16:19) *
о как их расположит файловая система ?

Как я понимаю, ФС это что-то вроде связанного списка. А списку не нужно линейное неразрывное пространство для хранения данных. Теперь я понял ваш вопрос. Я думал, вам нужна потокобезопасная одновременная запись.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.