Quiero vivir en España
Там же написано // и операции с файлом - например, вывод на экран
?
Акорневая директория - это что? Папка или файл? Если папка, то почему её можно открыть?
так это точно рабочая функция, пока не чистил скидываю тебе "как есть" я думаю сможешь выцепить нужное для себя void listDir(char * dir){ File root = SPIFFS.open(dir); File file = root.openNextFile(); String cache = ""; int cnt = 0; while(file){ if (file.size() > 0){ cnt++; } Serial.print(F("FILE: ")); Serial.println(file.name()); Serial.print(F("\tSIZE: ")); Serial.println(file.size()); //str if (String(dir).compareTo(F("/syski"))==0){ if (cnt <= COUNT_SYSKI){ cache = ""; if(!file || file.isDirectory()){Serial.println(F("- нет файла или это директория")); return; } Serial.println(F("- попытка чтения:")); while(file.available()) {cache = cache + char(file.read());} if (cache != ""){ sisArchive[cnt-1][1]=file.name(); Serial.println(file.name()); sisArchive[cnt-1][0]=cache; Serial.println(cache); c_sys = c_sys +1;}else { Serial.println(F("херня неведомая не проканало файло =("));} } } if (String(dir).compareTo( F("/cat"))==0){ if (cnt <= COUNT_CAT){ cache = ""; if(!file || file.isDirectory()){ Serial.println(F("- нет файла или это директория")); return; } Serial.println(F("- попытка чтения:")); while(file.available()){ cache = cache + char(file.read()); } //cache = re_file(file.name()); if (cache != ""){ catArchive[cnt-1][1]=file.name(); Serial.println(file.name()); catArchive[cnt-1][0]=cache; Serial.println(cache); c_cat = c_cat +1; }else { Serial.println(F("херня неведомая не проканало файло =("));} } } //file.close(); file = root.openNextFile(); } }
?
ля надо чистить. пасхалочки тут пипец.. ща покумекаю что я там понаписал.
Quiero vivir en España
папка не файл! ее НЕЛЬЗЯ открыть папка это просто адрес
В инструкции - можно. Directories (or folders) are special kinds of files
Quiero vivir en España
Syntax file.isDirectory() Parameters file: an instance of the File class (returned by SD.open()).
Quiero vivir en España
ля надо чистить. пасхалочки тут пипец.. ща покумекаю что я там понаписал.
А кумекать особо не надо. Там написано, что мы открываем все файлы по очереди: while (true) { root.openNextFile(); ... } и проверяем, является ли этот файл директорией. if (file.isDirectory()){ ... }
?
Syntax file.isDirectory() Parameters file: an instance of the File class (returned by SD.open()).
блин я тебе пример на SPIFSS кинул. с SD я давно не работал. есть тольок на esp8266 код, но я там пол либы fat перекопал чтобы наючить ее в любые символы. у тебя тольок корень перечисляет или ВСЕ файлы в том числе поддиректории? может просто написать фильтр в цикле ?
?
А кумекать особо не надо. Там написано, что мы открываем все файлы по очереди: while (true) { root.openNextFile(); ... } и проверяем, является ли этот файл директорией. if (file.isDirectory()){ ... }
я приложил код на внутреннюю флеш, а надо было на SD. разумеется там свои приколы. но если он перечисляет все, то можно просто имя файла чекать выцепляя там директорию
Quiero vivir en España
File dir = SD.open("/1"); вот так попробуй не закрывай слешем адрес т.к слеш справа это аппендикс
Попробую. Но заранее скажу, что будет false, т.к. без последнего слеша - это файл, а файла "1" на карте нет
?
Придётся цикл делать и все файлы перечислять, выводя только те, что находятся в нужной мне папке.
ты пробовал без слеша? я покопал старые бекапы. на esp8266 у меня точно папки без закрывающих слешей получались, иначе это лишние обработки.
?
Попробую. Но заранее скажу, что будет false, т.к. без последнего слеша - это файл, а файла "1" на карте нет
нет, тут ты не прав. он открыть должен, просто корень это и есть слеш. правила остальным файлам иначе идут... блин тупо объясняю. короче запусти и бага уйдет
Max
На SD используется FAT, если че. В исходниках написано.
?
просто в ESP8266 там файл и папка это разные переменные у меня были. когда код переписывал на ESP32 тип переменной "dir" уже не требовался, и все стало файлами. значит он открывает файл и узнать что файл это папка можно по маркеру.
?
да spifss и SD это абсолютно разные либы и они только сдалека похожи. но чую я все-же в слеше закрывающем зацепка. Больше всего бесит случайная запятая =) ох уж это программирование =)
Max
А фат позволяет одноименные папки и файлы в одной ветке, чот я запамятовал? Если да, то без закрывающего слеша будет беда отличить одно от другого.
Quiero vivir en España
Max
Да, это у них абстракция такая.
Max
Я тож думал, что две разных, а оно вон как
Quiero vivir en España
Для начала проверил так (говнокод ниже)
Quiero vivir en España
#include <SPI.h> #include <SD.h> File root; void setup() { Serial.begin(115200); //pinMode(10, OUTPUT); SD.begin(5); root = SD.open("/"); printDirectory(root); delay(2000); root.rewindDirectory(); printDirectory(root); root.close(); } void loop() { } void printDirectory(File dir) { while (true) { File entry = dir.openNextFile(); if (!entry) { break; //return; } if (entry.isDirectory()) { if (entry.name() == "kot"){Serial.println(" - - - - - - - - - - - - - - ");} Serial.print(entry.name()); Serial.println(" - dir"); while (true) { File fff = dir.openNextFile(); //или entry.openNext... if (!fff) { break; //return; } Serial.print(fff.name()); } } entry.close(); }
Max
fff.close тоже не помешает
Quiero vivir en España
На карточке создал папку kot с файлами. Итак, он выводит содержимое папки kot, но " - - - - - - - - - - - - - - " не выводит. То есть entry.isDirectory() - true entry.name() == "kot" - false. В же время, как entry.name() - kot
Quiero vivir en España
Max
strcmp в помощь
iҚØN🐾🐾
Что у вас за анальные проблемы с littlefs - не понятно. Когда я с ним игрался, проблема была лишь одна - размер флешки (не было сдкарты подключённой)
iҚØN🐾🐾
Остальное все работало
iҚØN🐾🐾
У них не проблемы, а удовольствие
А, ну это меняет дело :-)))
Max
Да нету никаких проблем.
iҚØN🐾🐾
Просто почитал утром - чёт не получалось что-то, ну ок. Сходил туда-сюда, днём смотрю - так же обсуждают)). А причина в удовольствии, ясно)
iҚØN🐾🐾
А на сдкартах вроде советуют фат юзать
?
А на сдкартах вроде советуют фат юзать
Да понятно, не в этом суть. Мы просто ждем результата. Насоветовали с трикороба уже.
?
А на сдкартах вроде советуют фат юзать
У него директория не открывалась. Потом сылка на память != char* ...
iҚØN🐾🐾
Ну т.е., на литтлфс при маунте на флешке все ок, а на сд нет?
Quiero vivir en España
Slava
Точно так же, как я чуть выше написал. Листинг ВСЕХ файлов.
Поясни, все файлы и папки перебираются и печатаются?
Slava
Да.
Ок, тогда что не работает?
Quiero vivir en España
entry.name возвращает указатель на строку, нельзя его сравнивать со строкой.
Блин. Понял. Собственно, в этом последняя загвоздка. А как сравнить указатель с char? Сравнение указателей выдаст false, а тут надо разыменовать entry.name()? То есть, переменная типа char char a = entry.name(); а дальше сравнивать &a и "kot"?
Quiero vivir en España
Ок, тогда что не работает?
Всё работает. Не работал утренний код.
Slava
Всё работает. Не работал утренний код.
Для усиления эффекта разберись с этим... https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer/examples/FSBrowser
iҚØN🐾🐾
entry.name() == "kot" - false. Вот так нельзя делать
iҚØN🐾🐾
Блин, учите сперва си
iҚØN🐾🐾
Покажи код лучше, щас разберемся)
iҚØN🐾🐾
У меня есть простой код, который делает ls 😊
Quiero vivir en España
Покажи код лучше, щас разберемся)
char * a = entry.name(); if (&a == "kot"){Serial.println(" - - - - - - - - - - - - - - ");} Понятно, что не сработает. Как правильно - я не знаю.
iҚØN🐾🐾
Йошкин кошкин
iҚØN🐾🐾
if (!strcmp(a, "kot")) {...
Max
Вот так, да
Quiero vivir en España
char * a = entry.name(); invalid conversion from 'const char*' to 'char*'
Slava
А сравнить String(a) и "кот" тоже ведь сработает?
Max
Да
Max
String(entry.name()) == "kot" тоже прокатит
Quiero vivir en España
А сравнить String(a) и "кот" тоже ведь сработает?
Говорят, стринги - зло. А все эти char со звёздочкой я понять не могу. Тупой потому что.
Max
Но грех
Max
Ибо объект создается.
iҚØN🐾🐾
А потом люди это отправляют в очередь и удивляются, почему у них инвалид поинтер
Max
Говорят, стринги - зло. А все эти char со звёздочкой я понять не могу. Тупой потому что.
Там все просто. Указатель - это адрес. & - получить адрес * - взять значение по адресу
Slava
Говорят, стринги - зло. А все эти char со звёздочкой я понять не могу. Тупой потому что.
Да вообще пох. Памяти хватает, говнокодить просто и понятно зато
Max
А жопа указателей состоит в том, что * используется для аннотации типа указателя.
Max
И это ортывает бошку неофитам