// funcs for editing the files in flash. bool flashStatus = false; // initialize littleFS for flash file system ctrl. void initFS() { if (!LittleFS.begin(true)){ if (InfoPrint == 1) {Serial.println("LittleFS mount failed.");} flashStatus = false; } else { if (InfoPrint == 1) {Serial.println("LittleFS mount succeed.");} flashStatus = true; } } // get the free space of flash. uint32_t freeFlashSpace(){ size_t total = LittleFS.totalBytes(); size_t used = LittleFS.usedBytes(); uint32_t freeSpace = total - used; if (InfoPrint == 1) { Serial.print("totalBytes:\t");Serial.print(total); Serial.println(" bytes"); Serial.print("free flash memory:\t");Serial.print(freeSpace); Serial.println(" bytes"); } jsonInfoHttp.clear(); jsonInfoHttp["info"] = "free flash space"; jsonInfoHttp["total"] = total; jsonInfoHttp["free"] = freeSpace; return freeSpace; } // scan all the files saved in flash. void scanFlashContents() { jsonInfoHttp.clear(); File root = LittleFS.open("/"); if (!root.isDirectory()) { if (InfoPrint == 1) { Serial.println("error: not a directory."); jsonInfoHttp["info"] = "error: not a directory."; return; } } jsonInfoHttp["info"] = "reading files and the first line"; File file = root.openNextFile(); while (file) { if (!file.isDirectory()) { Serial.println(">>>---=== File Name and First line ===---<<<"); Serial.println("[file]: [" + String(file.name()) + "]"); Serial.println("[first line]:"); String line = file.readStringUntil('\n'); if (line) { Serial.println(line); jsonInfoHttp[file.name()] = line; } else { Serial.println("no content."); jsonInfoHttp[file.name()] = "[null]"; } file.close(); } else if (file.isDirectory()) { if (file) { Serial.println("Failed to open file: " + String(file.name())); jsonInfoHttp[file.name()] = "[failed to open]"; } } file = root.openNextFile(); } } // create a new file and input the content. bool createFile(String fileName, String fileContent) { jsonInfoHttp.clear(); if (!flashStatus) { if (InfoPrint == 1) {Serial.println("LittleFS mount failed.");} jsonInfoHttp["info"] = "LittleFS mount failed."; return false; } if (LittleFS.exists("/"+fileName)) { if (InfoPrint == 1) {Serial.println("file already exists.");} jsonInfoHttp["info"] = "file already exists."; return false; } File file = LittleFS.open("/"+fileName, "w"); if (file) { // file.println("{\"name\":\"" + fileName + "\",\"intro\":\"" + fileContent + "\"}"); file.println(fileContent); file.close(); if (InfoPrint == 1) {Serial.println("file created successfully.");} jsonInfoHttp["info"] = "file created successfully."; return true; } else { if (InfoPrint == 1) {Serial.println("file creation failed.");} jsonInfoHttp["info"] = "file creation failed."; return false; } } // read a file, this function return the lineNum. int readFile(String fileName) { jsonInfoHttp.clear(); jsonInfoHttp["info"] = "reading file"; File file = LittleFS.open("/" + fileName, "r"); if (!file) { Serial.println("file not found."); jsonInfoHttp["info"] = "file not found"; return -1; } Serial.println("---=== File Content ===---"); Serial.println("reading file: [" + fileName + "] starts:"); jsonInfoHttp["name"] = fileName; int _LineNum = -1; while (file.available()) { _LineNum++; String line = file.readStringUntil('\n'); Serial.print("[lineNum: ");Serial.print(_LineNum+1);Serial.print(" ] - "); Serial.println(line); jsonInfoHttp["lineNum_"+String(_LineNum+1)] = line; } Serial.println("^^^ ^^^ ^^^ reading file: " + fileName + " ends. ^^^ ^^^ ^^^"); file.close(); return _LineNum + 1; } // delete a file. bool deleteFile(String inputName) { jsonInfoHttp.clear(); if (!flashStatus) { if (InfoPrint == 1) {Serial.println("LittleFS mount failed.");} jsonInfoHttp["info"] = "LittleFS mount failed."; return false; } if (!LittleFS.exists("/" + inputName)) { if (InfoPrint == 1) {Serial.println("file already deleted.");} jsonInfoHttp["info"] = "file already deleted."; return false; } LittleFS.remove("/" + inputName); if (InfoPrint == 1) {Serial.println("file deleted successfully.");} jsonInfoHttp["info"] = "file deleted successfully."; return true; } // add content at the end of a file. void appendLine(String fileName, String appendContent) { Serial.println("--- --- --- RAW FILE -- --- ---"); if (readFile(fileName) == -1) {return;} File file = LittleFS.open("/" + fileName, "a"); if(!file){ Serial.println("Error opening file for appending."); return; } file.println(appendContent); file.close(); Serial.println("--- --- --- NEW FILE -- --- ---"); jsonInfoHttp.clear(); readFile(fileName); } // insert a new line under the lineNum. void insertLine(String filename, int lineNum, String newLineString) { Serial.println("--- --- --- RAW FILE -- --- ---"); int _LineNum = readFile(filename); if (_LineNum == -1) {return;} String lines[_LineNum+1]; File file = LittleFS.open("/" + filename, "r"); if(!file){ Serial.println("Error opening file for writing."); return; } int i = 0; while (file.available()) { if (i == lineNum - 1) { lines[i] = newLineString; i++; } lines[i] = file.readStringUntil('\n'); i++; } file.close(); file = LittleFS.open("/" + filename, "w"); for(int j=0; j