LittleFS_test.ino 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. #include <Arduino.h>
  2. #include "FS.h"
  3. #include <LITTLEFS.h>
  4. /* You only need to format LITTLEFS the first time you run a
  5. test or else use the LITTLEFS plugin to create a partition
  6. https://github.com/lorol/arduino-esp32littlefs-plugin */
  7. #define FORMAT_LITTLEFS_IF_FAILED true
  8. void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
  9. Serial.printf("Listing directory: %s\r\n", dirname);
  10. File root = fs.open(dirname);
  11. if(!root){
  12. Serial.println("- failed to open directory");
  13. return;
  14. }
  15. if(!root.isDirectory()){
  16. Serial.println(" - not a directory");
  17. return;
  18. }
  19. File file = root.openNextFile();
  20. while(file){
  21. if(file.isDirectory()){
  22. Serial.print(" DIR : ");
  23. Serial.println(file.name());
  24. if(levels){
  25. listDir(fs, file.name(), levels -1);
  26. }
  27. } else {
  28. Serial.print(" FILE: ");
  29. Serial.print(file.name());
  30. Serial.print("\tSIZE: ");
  31. Serial.println(file.size());
  32. }
  33. file = root.openNextFile();
  34. }
  35. }
  36. void createDir(fs::FS &fs, const char * path){
  37. Serial.printf("Creating Dir: %s\n", path);
  38. if(fs.mkdir(path)){
  39. Serial.println("Dir created");
  40. } else {
  41. Serial.println("mkdir failed");
  42. }
  43. }
  44. void removeDir(fs::FS &fs, const char * path){
  45. Serial.printf("Removing Dir: %s\n", path);
  46. if(fs.rmdir(path)){
  47. Serial.println("Dir removed");
  48. } else {
  49. Serial.println("rmdir failed");
  50. }
  51. }
  52. void readFile(fs::FS &fs, const char * path){
  53. Serial.printf("Reading file: %s\r\n", path);
  54. File file = fs.open(path);
  55. if(!file || file.isDirectory()){
  56. Serial.println("- failed to open file for reading");
  57. return;
  58. }
  59. Serial.println("- read from file:");
  60. while(file.available()){
  61. Serial.write(file.read());
  62. }
  63. file.close();
  64. }
  65. void writeFile(fs::FS &fs, const char * path, const char * message){
  66. Serial.printf("Writing file: %s\r\n", path);
  67. File file = fs.open(path, FILE_WRITE);
  68. if(!file){
  69. Serial.println("- failed to open file for writing");
  70. return;
  71. }
  72. if(file.print(message)){
  73. Serial.println("- file written");
  74. } else {
  75. Serial.println("- write failed");
  76. }
  77. file.close();
  78. }
  79. void appendFile(fs::FS &fs, const char * path, const char * message){
  80. Serial.printf("Appending to file: %s\r\n", path);
  81. File file = fs.open(path, FILE_APPEND);
  82. if(!file){
  83. Serial.println("- failed to open file for appending");
  84. return;
  85. }
  86. if(file.print(message)){
  87. Serial.println("- message appended");
  88. } else {
  89. Serial.println("- append failed");
  90. }
  91. file.close();
  92. }
  93. void renameFile(fs::FS &fs, const char * path1, const char * path2){
  94. Serial.printf("Renaming file %s to %s\r\n", path1, path2);
  95. if (fs.rename(path1, path2)) {
  96. Serial.println("- file renamed");
  97. } else {
  98. Serial.println("- rename failed");
  99. }
  100. }
  101. void deleteFile(fs::FS &fs, const char * path){
  102. Serial.printf("Deleting file: %s\r\n", path);
  103. if(fs.remove(path)){
  104. Serial.println("- file deleted");
  105. } else {
  106. Serial.println("- delete failed");
  107. }
  108. }
  109. // SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1
  110. void writeFile2(fs::FS &fs, const char * path, const char * message){
  111. if(!fs.exists(path)){
  112. if (strchr(path, '/')) {
  113. Serial.printf("Create missing folders of: %s\r\n", path);
  114. char *pathStr = strdup(path);
  115. if (pathStr) {
  116. char *ptr = strchr(pathStr, '/');
  117. while (ptr) {
  118. *ptr = 0;
  119. fs.mkdir(pathStr);
  120. *ptr = '/';
  121. ptr = strchr(ptr+1, '/');
  122. }
  123. }
  124. free(pathStr);
  125. }
  126. }
  127. Serial.printf("Writing file to: %s\r\n", path);
  128. File file = fs.open(path, FILE_WRITE);
  129. if(!file){
  130. Serial.println("- failed to open file for writing");
  131. return;
  132. }
  133. if(file.print(message)){
  134. Serial.println("- file written");
  135. } else {
  136. Serial.println("- write failed");
  137. }
  138. file.close();
  139. }
  140. void deleteFile2(fs::FS &fs, const char * path){
  141. Serial.printf("Deleting file and empty folders on path: %s\r\n", path);
  142. if(fs.remove(path)){
  143. Serial.println("- file deleted");
  144. } else {
  145. Serial.println("- delete failed");
  146. }
  147. char *pathStr = strdup(path);
  148. if (pathStr) {
  149. char *ptr = strrchr(pathStr, '/');
  150. if (ptr) {
  151. Serial.printf("Removing all empty folders on path: %s\r\n", path);
  152. }
  153. while (ptr) {
  154. *ptr = 0;
  155. fs.rmdir(pathStr);
  156. ptr = strrchr(pathStr, '/');
  157. }
  158. free(pathStr);
  159. }
  160. }
  161. void testFileIO(fs::FS &fs, const char * path){
  162. Serial.printf("Testing file I/O with %s\r\n", path);
  163. static uint8_t buf[512];
  164. size_t len = 0;
  165. File file = fs.open(path, FILE_WRITE);
  166. if(!file){
  167. Serial.println("- failed to open file for writing");
  168. return;
  169. }
  170. size_t i;
  171. Serial.print("- writing" );
  172. uint32_t start = millis();
  173. for(i=0; i<2048; i++){
  174. if ((i & 0x001F) == 0x001F){
  175. Serial.print(".");
  176. }
  177. file.write(buf, 512);
  178. }
  179. Serial.println("");
  180. uint32_t end = millis() - start;
  181. Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
  182. file.close();
  183. file = fs.open(path);
  184. start = millis();
  185. end = start;
  186. i = 0;
  187. if(file && !file.isDirectory()){
  188. len = file.size();
  189. size_t flen = len;
  190. start = millis();
  191. Serial.print("- reading" );
  192. while(len){
  193. size_t toRead = len;
  194. if(toRead > 512){
  195. toRead = 512;
  196. }
  197. file.read(buf, toRead);
  198. if ((i++ & 0x001F) == 0x001F){
  199. Serial.print(".");
  200. }
  201. len -= toRead;
  202. }
  203. Serial.println("");
  204. end = millis() - start;
  205. Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
  206. file.close();
  207. } else {
  208. Serial.println("- failed to open file for reading");
  209. }
  210. }
  211. void setup(){
  212. Serial.begin(115200);
  213. if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
  214. Serial.println("LITTLEFS Mount Failed");
  215. return;
  216. }
  217. Serial.println( "SPIFFS-like write file to new path and delete it w/folders" );
  218. writeFile2(LITTLEFS, "/new1/new2/new3/hello3.txt", "Hello3");
  219. listDir(LITTLEFS, "/", 3);
  220. deleteFile2(LITTLEFS, "/new1/new2/new3/hello3.txt");
  221. listDir(LITTLEFS, "/", 3);
  222. createDir(LITTLEFS, "/mydir");
  223. writeFile(LITTLEFS, "/mydir/hello2.txt", "Hello2");
  224. listDir(LITTLEFS, "/", 1);
  225. deleteFile(LITTLEFS, "/mydir/hello2.txt");
  226. removeDir(LITTLEFS, "/mydir");
  227. listDir(LITTLEFS, "/", 1);
  228. writeFile(LITTLEFS, "/hello.txt", "Hello ");
  229. appendFile(LITTLEFS, "/hello.txt", "World!\r\n");
  230. readFile(LITTLEFS, "/hello.txt");
  231. renameFile(LITTLEFS, "/hello.txt", "/foo.txt");
  232. readFile(LITTLEFS, "/foo.txt");
  233. deleteFile(LITTLEFS, "/foo.txt");
  234. testFileIO(LITTLEFS, "/test.txt");
  235. deleteFile(LITTLEFS, "/test.txt");
  236. Serial.println( "Test complete" );
  237. }
  238. void loop(){
  239. }