|
Приемы работы с FATFS. |
|
|
|
Dec 6 2016, 08:01
|
Гуру
     
Группа: Свой
Сообщений: 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 не гарантирует перебор файлов в каталоге в каком то определенном порядке.
|
|
|
|
|
Dec 6 2016, 09:04
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 6 2016, 11:15
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата я понял. то есть нужно считать все имена файлов сохранить их где то и перебрать. та еще морока. я так понимаю количество файлов можно узнать только перебрав все файлы. Да Цитата придумал. буду перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть, инкрементирую номер, получил ошибку – файла нет, создаю файл с этим номером. Тоже вариант, хотя и довольно затратный. Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее)
|
|
|
|
|
Dec 8 2016, 12:34
|
Профессионал
    
Группа: Участник
Сообщений: 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)  Если Вы ищете первое свободное место в порядке нумерации файлов, то зачем вообще что-то сохранять??? Нашли первую "дырку" и закончили перебор. поэтому я и решил что оптимальней всего искать дырку.
|
|
|
|
|
Dec 8 2016, 16:38
|
Гуру
     
Группа: Свой
Сообщений: 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" в названии несут смысловую нагрузку? они должны идти по порядку (более поздний имеет бОльший номер) или просто быть уникальными? Если просто уникальными- то Ваш метод с поиском до первого ненайденного файла работает. Если должны идти по порядку- то Вы должны проверить весть каталог и записать файл со следующим номером после максимального найденного. Метод "перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть"- с точки зрения ресурсов самый затратный и медленный путь, хуже и придумать сложно. Чудес нет- ФАТ читается в том порядке, в котором сектор забит записями, и это никак не привязано ни к времени, ни к алфавиту. Так что перечитать нужно все до конца. Но один раз, а не как Вы хотите- столько раз, сколько файлов имеется.
|
|
|
|
|
Dec 12 2016, 07:16
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 12 2016, 10:35
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Сергей Борщ @ Dec 12 2016, 13:16)  Чтение документации из интернета вслух - 100 евро/час. Дальше читайте сами. спасибо.  Цитата FA_CREATE_ALWAYS - Creates a new file. If the file is existing, it will be truncated and overwritten.
|
|
|
|
|
Mar 1 2017, 15:12
|

Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|