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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Приемы работы с FATFS.
Jenya7
сообщение Dec 6 2016, 07:23
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я работаю с FATFS. Пишу/читаю файлы на SD. Как работать с одним файлом понятно.
Но если есть список файлов file#1.xml, file#2.xml,….file#100.xml. Как мне их перебрать эффективно?
Есть функции f_findfirst и f_findnext. Но что для них first а что next? Скажем если я задам маску "file#*.xml" - first будет первый по порядковому номеру?
Я хотел посмотреть если есть дырка, скажем file#1.xml, file#2.xml, file#4.xml - значит file#3 отсутствует то его и создать.
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 6 2016, 08:01
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



f_findfirst начинает процесс перебора файлов в каталоге, f_findnext продолжает этот процесс. Смотрите пример использоваания - http://elm-chan.org/fsw/ff/en/findfirst.html

Цитата
Я хотел посмотреть если есть дырка, скажем file#1.xml, file#2.xml, file#4.xml - значит file#3 отсутствует то его и создать.
Вам придется перебрать все файлы, и лишь потом вы сможете определить, каких именно файлов не хватает. FAT не гарантирует перебор файлов в каталоге в каком то определенном порядке.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 6 2016, 09:04
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(XVR @ Dec 6 2016, 13:01) *
f_findfirst начинает процесс перебора файлов в каталоге, f_findnext продолжает этот процесс. Смотрите пример использоваания - http://elm-chan.org/fsw/ff/en/findfirst.html

Вам придется перебрать все файлы, и лишь потом вы сможете определить, каких именно файлов не хватает. FAT не гарантирует перебор файлов в каталоге в каком то определенном порядке.

я понял. то есть нужно считать все имена файлов сохранить их где то и перебрать. та еще морока. я так понимаю количество файлов можно узнать только перебрав все файлы.

придумал. буду перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть, инкрементирую номер, получил ошибку – файла нет, создаю файл с этим номером.

Сообщение отредактировал Jenya7 - Dec 6 2016, 09:44
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 6 2016, 11:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
я понял. то есть нужно считать все имена файлов сохранить их где то и перебрать. та еще морока. я так понимаю количество файлов можно узнать только перебрав все файлы.
Да
Цитата
придумал. буду перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть, инкрементирую номер, получил ошибку – файла нет, создаю файл с этим номером.
Тоже вариант, хотя и довольно затратный.
Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 6 2016, 11:36
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(XVR @ Dec 6 2016, 16:15) *
Да
Тоже вариант, хотя и довольно затратный.
Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее)

так считать все файлы это полный пробег. к тому же не зная количество файлов затруднительно выделить размер буфера под номера, которые тоже потребуют полного пробега. а так есть надежда что где нибудь посередине нам повезет. sm.gif

хотя... по команде открыть файл тоже идет перебор имен файлов.

кстати а как узнать сколько места осталось на SD карте?

Сообщение отредактировал Jenya7 - Dec 6 2016, 14:02
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 8 2016, 09:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(XVR @ Dec 6 2016, 14:15) *
Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее)

Вообще-то в таких случаях как бы само собой разумеющееся решение - битовая карта. Всего 1 бит на файл.

Цитата(Jenya7 @ Dec 6 2016, 14:36) *
так считать все файлы это полный пробег. к тому же не зная количество файлов затруднительно выделить размер буфера под номера, которые тоже потребуют полного пробега. а так есть надежда что где нибудь посередине нам повезет. sm.gif

Если Вы ищете первое свободное место в порядке нумерации файлов, то зачем вообще что-то сохранять??? Нашли первую "дырку" и закончили перебор.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 8 2016, 12:34
Сообщение #7


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Dec 8 2016, 15:25) *
Вообще-то в таких случаях как бы само собой разумеющееся решение - битовая карта. Всего 1 бит на файл.

я думал про битовую карту. если учесть что может быть 100 файлов то либо создать 4 uint32_t либо
Код
typedef struct
{
    uint32_t file_0  : 1;
    uint32_t file_1  : 1;
   -------------
   uint32_t file_100  : 1;
}FILES;

последнее вобще то из разряда извращений.


Цитата(jcxz @ Dec 8 2016, 15:25) *
Если Вы ищете первое свободное место в порядке нумерации файлов, то зачем вообще что-то сохранять??? Нашли первую "дырку" и закончили перебор.

поэтому я и решил что оптимальней всего искать дырку.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Dec 8 2016, 16:38
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Jenya7 @ Dec 6 2016, 10:23) *
Я работаю с FATFS. Пишу/читаю файлы на SD. Как работать с одним файлом понятно.
Но если есть список файлов file#1.xml, file#2.xml,….file#100.xml. Как мне их перебрать эффективно?
Есть функции f_findfirst и f_findnext. Но что для них first а что next? Скажем если я задам маску "file#*.xml" - first будет первый по порядковому номеру?
Я хотел посмотреть если есть дырка, скажем file#1.xml, file#2.xml, file#4.xml - значит file#3 отсутствует то его и создать.

Эти цифры "#1"..."#100" в названии несут смысловую нагрузку? они должны идти по порядку (более поздний имеет бОльший номер) или просто быть уникальными?
Если просто уникальными- то Ваш метод с поиском до первого ненайденного файла работает.
Если должны идти по порядку- то Вы должны проверить весть каталог и записать файл со следующим номером после максимального найденного.

Метод "перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть"- с точки зрения ресурсов самый затратный и медленный путь, хуже и придумать сложно.

Чудес нет- ФАТ читается в том порядке, в котором сектор забит записями, и это никак не привязано ни к времени, ни к алфавиту. Так что перечитать нужно все до конца. Но один раз, а не как Вы хотите- столько раз, сколько файлов имеется.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 9 2016, 09:08
Сообщение #9


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Алгоритм такой. Пользователь создает новую задачу. Я решил под каждую задачу создавать файл. Ну а номера для удобства. Как мне кажеться лучше следить чтоб номера не шли вразброс а были упорядочены. А считывать один раз нужно что? имена файлов? проблема что заранее не знаешь сколько файлов имеется и сколько места отводить под массив имен.

Сообщение отредактировал Herz - Dec 10 2016, 10:19
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 12 2016, 07:02
Сообщение #10


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Пролема однако. При перезаписи файла кусок старых данных остается. А как почистить файл перед записью?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 12 2016, 07:16
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Dec 12 2016, 10:02) *
А как почистить файл перед записью?
Чтение документации из интернета вслух - 100 евро/час.

QUOTE
mode
Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags.
Дальше читайте сами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 12 2016, 10:35
Сообщение #12


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Dec 12 2016, 13:16) *
Чтение документации из интернета вслух - 100 евро/час.

Дальше читайте сами.

спасибо. sm.gif
Цитата
FA_CREATE_ALWAYS - Creates a new file. If the file is existing, it will be truncated and overwritten.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 20 2016, 07:11
Сообщение #13


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



а вот если мне в файле нужно найти какое нибудь слово. я должен скопировать файл в буффер в RAM и там искать? другого способа нет?
Go to the top of the page
 
+Quote Post
kolobochishe
сообщение Mar 1 2017, 15:12
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Цитата(Jenya7 @ Dec 20 2016, 12:11) *
а вот если мне в файле нужно найти какое нибудь слово. я должен скопировать файл в буффер в RAM и там искать? другого способа нет?


Ну да. С флешки лучше всего подойдет чтение блоками по 512 байт (если объем памяти под буфер критичен). Т.к. физически минимальная единица чтения/записи - 512 байт. Далее поиск нужного слова в буфере (надо, правда учитывать, что слово может быть "разорвано" между блоками). Адрес следующего блока всегда должен быть кратен 512 от начала файла. Тогда можно быть точно уверенным, что не читалось два 512-байтных блока.

А свободное место считается в FAT32 по структуре FS_Info. Как в остальных ФС не знаю. Но есть, правда уточнение, что не все устройства поддерживают обновление FS_Info и если чтение/запись еще будет на другом устройстве, то информация в FS_Info может и не соответствовать действительности. В FatFS сам проверял - FS_Info обновляется и в каждой копии FAT_TABLE. В ОС Windows тоже.

Если надо точно быть уверенным в случае использования флешки "на стороне" - нужно пройтись по всем DIR_ENTRY в файловой таблице.

Сообщение отредактировал kolobochishe - Mar 1 2017, 15:16
Go to the top of the page
 
+Quote Post
mantech
сообщение Mar 6 2017, 18:30
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(kolobochishe @ Mar 1 2017, 18:12) *
С флешки лучше всего подойдет чтение блоками по 512 байт (если объем памяти под буфер критичен). Т.к. физически минимальная единица чтения/записи - 512 байт.


Если хотите читать неторопясь, особенно с SD карт, то 512 байт, а если "по уму", то по 4Кбайта rolleyes.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 8th July 2025 - 22:01
Рейтинг@Mail.ru


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