LittleFS_test.ino 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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
  110. // See: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.cpp#L60
  111. void writeFile2(fs::FS &fs, const char * path, const char * message){
  112. if(!fs.exists(path)){
  113. if (strchr(path, '/')) {
  114. Serial.printf("Create missing folders of: %s\r\n", path);
  115. char *pathStr = strdup(path);
  116. if (pathStr) {
  117. char *ptr = strchr(pathStr, '/');
  118. while (ptr) {
  119. *ptr = 0;
  120. fs.mkdir(pathStr);
  121. *ptr = '/';
  122. ptr = strchr(ptr+1, '/');
  123. }
  124. }
  125. free(pathStr);
  126. }
  127. }
  128. Serial.printf("Writing file to: %s\r\n", path);
  129. File file = fs.open(path, FILE_WRITE);
  130. if(!file){
  131. Serial.println("- failed to open file for writing");
  132. return;
  133. }
  134. if(file.print(message)){
  135. Serial.println("- file written");
  136. } else {
  137. Serial.println("- write failed");
  138. }
  139. file.close();
  140. }
  141. // See: https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.h#L149
  142. void deleteFile2(fs::FS &fs, const char * path){
  143. Serial.printf("Deleting file and empty folders on path: %s\r\n", path);
  144. if(fs.remove(path)){
  145. Serial.println("- file deleted");
  146. } else {
  147. Serial.println("- delete failed");
  148. }
  149. char *pathStr = strdup(path);
  150. if (pathStr) {
  151. char *ptr = strrchr(pathStr, '/');
  152. if (ptr) {
  153. Serial.printf("Removing all empty folders on path: %s\r\n", path);
  154. }
  155. while (ptr) {
  156. *ptr = 0;
  157. fs.rmdir(pathStr);
  158. ptr = strrchr(pathStr, '/');
  159. }
  160. free(pathStr);
  161. }
  162. }
  163. void testFileIO(fs::FS &fs, const char * path){
  164. Serial.printf("Testing file I/O with %s\r\n", path);
  165. static uint8_t buf[512];
  166. size_t len = 0;
  167. File file = fs.open(path, FILE_WRITE);
  168. if(!file){
  169. Serial.println("- failed to open file for writing");
  170. return;
  171. }
  172. size_t i;
  173. Serial.print("- writing" );
  174. uint32_t start = millis();
  175. for(i=0; i<2048; i++){
  176. if ((i & 0x001F) == 0x001F){
  177. Serial.print(".");
  178. }
  179. file.write(buf, 512);
  180. }
  181. Serial.println("");
  182. uint32_t end = millis() - start;
  183. Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
  184. file.close();
  185. file = fs.open(path);
  186. start = millis();
  187. end = start;
  188. i = 0;
  189. if(file && !file.isDirectory()){
  190. len = file.size();
  191. size_t flen = len;
  192. start = millis();
  193. Serial.print("- reading" );
  194. while(len){
  195. size_t toRead = len;
  196. if(toRead > 512){
  197. toRead = 512;
  198. }
  199. file.read(buf, toRead);
  200. if ((i++ & 0x001F) == 0x001F){
  201. Serial.print(".");
  202. }
  203. len -= toRead;
  204. }
  205. Serial.println("");
  206. end = millis() - start;
  207. Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
  208. file.close();
  209. } else {
  210. Serial.println("- failed to open file for reading");
  211. }
  212. }
  213. void setup(){
  214. Serial.begin(115200);
  215. if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)){
  216. Serial.println("LITTLEFS Mount Failed");
  217. return;
  218. }
  219. Serial.println( "SPIFFS-like write file to new path and delete it w/folders" );
  220. writeFile2(LITTLEFS, "/new1/new2/new3/hello3.txt", "Hello3");
  221. listDir(LITTLEFS, "/", 3);
  222. deleteFile2(LITTLEFS, "/new1/new2/new3/hello3.txt");
  223. listDir(LITTLEFS, "/", 3);
  224. createDir(LITTLEFS, "/mydir");
  225. writeFile(LITTLEFS, "/mydir/hello2.txt", "Hello2");
  226. listDir(LITTLEFS, "/", 1);
  227. deleteFile(LITTLEFS, "/mydir/hello2.txt");
  228. removeDir(LITTLEFS, "/mydir");
  229. listDir(LITTLEFS, "/", 1);
  230. writeFile(LITTLEFS, "/hello.txt", "Hello ");
  231. appendFile(LITTLEFS, "/hello.txt", "World!\r\n");
  232. readFile(LITTLEFS, "/hello.txt");
  233. renameFile(LITTLEFS, "/hello.txt", "/foo.txt");
  234. readFile(LITTLEFS, "/foo.txt");
  235. deleteFile(LITTLEFS, "/foo.txt");
  236. testFileIO(LITTLEFS, "/test.txt");
  237. deleteFile(LITTLEFS, "/test.txt");
  238. Serial.println( "Test complete" );
  239. }
  240. void loop(){
  241. }