jenya7 0 6 декабря, 2016 Опубликовано 6 декабря, 2016 · Жалоба Я работаю с 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 отсутствует то его и создать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 декабря, 2016 Опубликовано 6 декабря, 2016 · Жалоба 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 не гарантирует перебор файлов в каталоге в каком то определенном порядке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 декабря, 2016 Опубликовано 6 декабря, 2016 (изменено) · Жалоба f_findfirst начинает процесс перебора файлов в каталоге, f_findnext продолжает этот процесс. Смотрите пример использоваания - http://elm-chan.org/fsw/ff/en/findfirst.html Вам придется перебрать все файлы, и лишь потом вы сможете определить, каких именно файлов не хватает. FAT не гарантирует перебор файлов в каталоге в каком то определенном порядке. я понял. то есть нужно считать все имена файлов сохранить их где то и перебрать. та еще морока. я так понимаю количество файлов можно узнать только перебрав все файлы. придумал. буду перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть, инкрементирую номер, получил ошибку – файла нет, создаю файл с этим номером. Изменено 6 декабря, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 декабря, 2016 Опубликовано 6 декабря, 2016 · Жалоба я понял. то есть нужно считать все имена файлов сохранить их где то и перебрать. та еще морока. я так понимаю количество файлов можно узнать только перебрав все файлы.Да придумал. буду перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть, инкрементирую номер, получил ошибку – файла нет, создаю файл с этим номером.Тоже вариант, хотя и довольно затратный. Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 декабря, 2016 Опубликовано 6 декабря, 2016 (изменено) · Жалоба Да Тоже вариант, хотя и довольно затратный. Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее) так считать все файлы это полный пробег. к тому же не зная количество файлов затруднительно выделить размер буфера под номера, которые тоже потребуют полного пробега. а так есть надежда что где нибудь посередине нам повезет. :) хотя... по команде открыть файл тоже идет перебор имен файлов. кстати а как узнать сколько места осталось на SD карте? Изменено 6 декабря, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Можно считать все имена файлов, выделить из них номер и именно его сохранять. Получится экономичнее, чем сохранять целиком имена. Можно еще сэкономить - сохранять не отдельные номера, а интервалы (хотя в реализации это сложнее) Вообще-то в таких случаях как бы само собой разумеющееся решение - битовая карта. Всего 1 бит на файл. так считать все файлы это полный пробег. к тому же не зная количество файлов затруднительно выделить размер буфера под номера, которые тоже потребуют полного пробега. а так есть надежда что где нибудь посередине нам повезет. :) Если Вы ищете первое свободное место в порядке нумерации файлов, то зачем вообще что-то сохранять??? Нашли первую "дырку" и закончили перебор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Вообще-то в таких случаях как бы само собой разумеющееся решение - битовая карта. Всего 1 бит на файл. я думал про битовую карту. если учесть что может быть 100 файлов то либо создать 4 uint32_t либо typedef struct { uint32_t file_0 : 1; uint32_t file_1 : 1; ------------- uint32_t file_100 : 1; }FILES; последнее вобще то из разряда извращений. Если Вы ищете первое свободное место в порядке нумерации файлов, то зачем вообще что-то сохранять??? Нашли первую "дырку" и закончили перебор. поэтому я и решил что оптимальней всего искать дырку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Я работаю с 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" в названии несут смысловую нагрузку? они должны идти по порядку (более поздний имеет бОльший номер) или просто быть уникальными? Если просто уникальными- то Ваш метод с поиском до первого ненайденного файла работает. Если должны идти по порядку- то Вы должны проверить весть каталог и записать файл со следующим номером после максимального найденного. Метод "перебирать номера и пытаться открыть файл с этим номером. открыл - значит файл есть"- с точки зрения ресурсов самый затратный и медленный путь, хуже и придумать сложно. Чудес нет- ФАТ читается в том порядке, в котором сектор забит записями, и это никак не привязано ни к времени, ни к алфавиту. Так что перечитать нужно все до конца. Но один раз, а не как Вы хотите- столько раз, сколько файлов имеется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 декабря, 2016 Опубликовано 9 декабря, 2016 (изменено) · Жалоба Алгоритм такой. Пользователь создает новую задачу. Я решил под каждую задачу создавать файл. Ну а номера для удобства. Как мне кажеться лучше следить чтоб номера не шли вразброс а были упорядочены. А считывать один раз нужно что? имена файлов? проблема что заранее не знаешь сколько файлов имеется и сколько места отводить под массив имен. Изменено 10 декабря, 2016 пользователем Herz Избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 · Жалоба Пролема однако. При перезаписи файла кусок старых данных остается. А как почистить файл перед записью? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 12 декабря, 2016 Опубликовано 12 декабря, 2016 · Жалоба А как почистить файл перед записью?Чтение документации из интернета вслух - 100 евро/час. mode Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags. Дальше читайте сами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 · Жалоба Чтение документации из интернета вслух - 100 евро/час. Дальше читайте сами. спасибо. :) FA_CREATE_ALWAYS - Creates a new file. If the file is existing, it will be truncated and overwritten. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 20 декабря, 2016 Опубликовано 20 декабря, 2016 · Жалоба а вот если мне в файле нужно найти какое нибудь слово. я должен скопировать файл в буффер в RAM и там искать? другого способа нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 0 1 марта, 2017 Опубликовано 1 марта, 2017 (изменено) · Жалоба а вот если мне в файле нужно найти какое нибудь слово. я должен скопировать файл в буффер в RAM и там искать? другого способа нет? Ну да. С флешки лучше всего подойдет чтение блоками по 512 байт (если объем памяти под буфер критичен). Т.к. физически минимальная единица чтения/записи - 512 байт. Далее поиск нужного слова в буфере (надо, правда учитывать, что слово может быть "разорвано" между блоками). Адрес следующего блока всегда должен быть кратен 512 от начала файла. Тогда можно быть точно уверенным, что не читалось два 512-байтных блока. А свободное место считается в FAT32 по структуре FS_Info. Как в остальных ФС не знаю. Но есть, правда уточнение, что не все устройства поддерживают обновление FS_Info и если чтение/запись еще будет на другом устройстве, то информация в FS_Info может и не соответствовать действительности. В FatFS сам проверял - FS_Info обновляется и в каждой копии FAT_TABLE. В ОС Windows тоже. Если надо точно быть уверенным в случае использования флешки "на стороне" - нужно пройтись по всем DIR_ENTRY в файловой таблице. Изменено 1 марта, 2017 пользователем kolobochishe Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 6 марта, 2017 Опубликовано 6 марта, 2017 · Жалоба С флешки лучше всего подойдет чтение блоками по 512 байт (если объем памяти под буфер критичен). Т.к. физически минимальная единица чтения/записи - 512 байт. Если хотите читать неторопясь, особенно с SD карт, то 512 байт, а если "по уму", то по 4Кбайта :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться