Cómo usar SPIFFS en tu programa Arduino para ESP8266:
Como paso inicial, tenemos que incluir la librería "FS.h". Ésta librería no se puede usar junto a la librería de SD ya que colisiona con ella:
Hemos de tener en cuenta las siguientes limitaciones del sistema de archivos:
- La longitud máxima de la ruta de archivos es 31 carácteres (32 menos el terminador de string).
- No tenemos directorios. A cambio, podemos usar "/" dentro del nombre de archivo ("/ejemplos/ejemplo1.txt" sería un nombre completo, no un archivo dentro de la carpeta "ejemplos")
Funciones:
* Para empezar a usar el SPIFFS deberemos usar:
Retorna true si funciona correctamente
* Asimismo, si queremos dejar de usarlo utilizaremos:
* Si, por ejemplo, queremos usarlo para guardar datos del programa pero no hemos subido nada desde el ordenador, podemos formatear la unidad:
Puede ser llamado antes o después del begin(). Devuelve true si el formato se ha realizado con éxito.
* Para comprobar si existe un archivo usaremos:
Devolverá true si el archivo existe. Recuerda que el path es el nombre completo, no un archivo dentro de una carpeta.
* Existe un filtrado, que se usa como algo similar a carpetas:
Pero, ¿no hemos dicho que no existen carpetas? Sí, lo que hace este comando es listar los archivos que comienzan por esa ruta.
Devuelve un objeto tipo "Dir", que puedes usar así:
Código: Seleccionar todo
Dir dir = SPIFFS.openDir("/data");
while (dir.next()) {
Serial.print(dir.fileName()); // Nombre del archivo
File f = dir.openFile("r"); // Abrir archivo
Serial.println(f.size()); // Tamaño; lo veremos mas tarde.
}
* Para abrir un fichero usaremos:
Mode es:
- r = Sólo lectura. El cursor se posiciona al principio del archivo
- r+ = Lectura y escritura. El cursor se posiciona al principio del archivo
- w = Escritura. Si el archivo existe lo trunca a 0 bytes. El cursor se posiciona al principio del archivo, aunque siendo 0 bytes es la única opción.
- w+ = Lectura y escritura. Trunca el archivo a 0 bytes si existe o lo crea si no existe. El cursor se posiciona al principio del archivo, aunque siendo 0 bytes es la única opción.
- a = Escritura al final, 'append'. Abre un archivo sin truncarlo o lo crea si no existe. El cursor se posiciona al final del archivo.
- a+ = Escritura al final, 'append'. Abre un archivo sin truncarlo o lo crea si no existe. El cursor se posiciona al principio del archivo pero cualquier escritura se hará al final.
* Para eliminar un fichero usaremos:
Devuelve true si ha sido correctamente eliminado.
* Para cambiar el nombre de un fichero usaremos:
Devuelve true si ha sido correctamente cambiado de nombre.
* Para obtener información del sistema de archivos::
La estructura FSInfo es:
Código: Seleccionar todo
struct FSInfo {
size_t totalBytes; // Tamaño total usable en el sistema de archivos en bytes
size_t usedBytes; // Bytes usados en el sistema de archivos
size_t blockSize; // Tamaño del bloque, en bytes
size_t pageSize; // Tamaño de la página, en butes
size_t maxOpenFiles; // Numero máximo de archivos abiertos simultáneamente.
size_t maxPathLength; // Tamaño máximo del path, incluyendo el '\0' final. Normalmente debería ser 32.
};
Operaciones del objeto archivo:
Tras abrir un archivo con cualquiera de éstas operaciones:
Código: Seleccionar todo
File file = SPIFFS.open(path, mode); // Abrir un archivo directamente
File file2 = dir.openFile(mode); // En el bucle tras usar SPIFFS.openDir(path);
Obtenemos un objeto tipo File con el que podemos usar las
funciones de la clase Stream como readBytes, findUntil, parseInt, println y similares.
Además, tenemos disponibles las siguientes funciones:
* File.seek
Se comporta como la función fseek de C.
Los valores de mode son:
- SeekSet - Se mueve el cursor 'offset' bytes desde el inicio del archivo.
- SeekCur - Se mueve el cursor 'offset' bytes desde la posición actual del mismo.
- SeekEnd - - Se mueve el cursor 'offset' bytes desde el final del archivo. Se usa con offsets negativos.
Devuelve true en caso de realizarse correctamente.
* File.position
Devuelve la posición actual del cursor en bytes.
* File.size
Devuelve el tamaño del archivo en bytes.
* File.name
Devuelve el nombre del archivo como un const char*.
* File.close
Cierra un archivo. No se podrán realizar operaciones en la variable "file" a no ser que abramos otro archivo (que podría ser el mismo, si lo deseamos).
Ejemplo:
Podéis ver un ejemplo aquí:
https://github.com/squix78/esp8266-proj ... xample.ino