реклама на сайте
подробности

 
 
> fat_fs запись в два файла, Сколько место выделяется под файл?
pokk
сообщение Feb 20 2018, 06:52
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



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

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


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
megajohn
сообщение Feb 20 2018, 07:44
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(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;
}


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
pokk
сообщение Feb 20 2018, 08:19
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(megajohn @ Feb 20 2018, 10:44) *
брр, все время было равно sizeof( FIL )

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



Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 20:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016