mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
* Add fileCreation/getCreation create-time accessors For SDFS and LittleFS, enable a creation time accessor for files and Dir iterators, similar to the existing fileTime/getLastWrite calls. Remove spurious Dir::getLastWrite method (the proper and only documented way is really Dir::fileTime). Update json to point to new mklittlefs which copies the creation date of files to the image. Fixes #6992 * Remove malloc(), use stack vars for temp names LFS filenames are limited in size and generally very small. Use a stack variable instead of a dynamic allocation when performing full-path computations. * Replace "Creation" w/"CreationTime" in FS accessor Per review, `getCreation` -> `getCreationTime`, `fileCreation` -> `fileCreationTime`. The names `fileTime()` and `getLastWrite()` are inherited from ESP32 implementation and unchanged. * Add creation time to listfiles SD example * Enable SdFat's sateTime callback for timestamping SdFat requries the dateTimeCallback call (global for everything) to update dates and times on created files. Because the callback signature doesn't have space for us to provide any parameters, we cannot get the the File, Dir, or FS object's dateTimeCB member. Instead, just go with `time(null)` as the callback function which is right in all but the most esoteric cases. * Correct DOS year/month offset in dateTime callback * Fix docs to match new xxxCreationTime() API names Co-authored-by: Develo <deveyes@gmail.com>
190 lines
4.7 KiB
C++
190 lines
4.7 KiB
C++
/* Example showing timestamp support in LittleFS */
|
|
/* Released into the public domain. */
|
|
/* Earle F. Philhower, III <earlephilhower@yahoo.com> */
|
|
|
|
#include <FS.h>
|
|
#include <LittleFS.h>
|
|
#include <time.h>
|
|
#include <ESP8266WiFi.h>
|
|
|
|
#ifndef STASSID
|
|
#define STASSID "your-ssid"
|
|
#define STAPSK "your-password"
|
|
#endif
|
|
|
|
const char *ssid = STASSID;
|
|
const char *pass = STAPSK;
|
|
|
|
long timezone = 2;
|
|
byte daysavetime = 1;
|
|
|
|
|
|
bool getLocalTime(struct tm * info, uint32_t ms) {
|
|
uint32_t count = ms / 10;
|
|
time_t now;
|
|
|
|
time(&now);
|
|
localtime_r(&now, info);
|
|
|
|
if (info->tm_year > (2016 - 1900)) {
|
|
return true;
|
|
}
|
|
|
|
while (count--) {
|
|
delay(10);
|
|
time(&now);
|
|
localtime_r(&now, info);
|
|
if (info->tm_year > (2016 - 1900)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
void listDir(const char * dirname) {
|
|
Serial.printf("Listing directory: %s\n", dirname);
|
|
|
|
Dir root = LittleFS.openDir(dirname);
|
|
|
|
while (root.next()) {
|
|
File file = root.openFile("r");
|
|
Serial.print(" FILE: ");
|
|
Serial.print(root.fileName());
|
|
Serial.print(" SIZE: ");
|
|
Serial.print(file.size());
|
|
time_t cr = file.getCreationTime();
|
|
time_t lw = file.getLastWrite();
|
|
file.close();
|
|
struct tm * tmstruct = localtime(&cr);
|
|
Serial.printf(" CREATION: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
|
|
tmstruct = localtime(&lw);
|
|
Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec);
|
|
}
|
|
}
|
|
|
|
|
|
void readFile(const char * path) {
|
|
Serial.printf("Reading file: %s\n", path);
|
|
|
|
File file = LittleFS.open(path, "r");
|
|
if (!file) {
|
|
Serial.println("Failed to open file for reading");
|
|
return;
|
|
}
|
|
|
|
Serial.print("Read from file: ");
|
|
while (file.available()) {
|
|
Serial.write(file.read());
|
|
}
|
|
file.close();
|
|
}
|
|
|
|
void writeFile(const char * path, const char * message) {
|
|
Serial.printf("Writing file: %s\n", path);
|
|
|
|
File file = LittleFS.open(path, "w");
|
|
if (!file) {
|
|
Serial.println("Failed to open file for writing");
|
|
return;
|
|
}
|
|
if (file.print(message)) {
|
|
Serial.println("File written");
|
|
} else {
|
|
Serial.println("Write failed");
|
|
}
|
|
delay(2000); // Make sure the CREATE and LASTWRITE times are different
|
|
file.close();
|
|
}
|
|
|
|
void appendFile(const char * path, const char * message) {
|
|
Serial.printf("Appending to file: %s\n", path);
|
|
|
|
File file = LittleFS.open(path, "a");
|
|
if (!file) {
|
|
Serial.println("Failed to open file for appending");
|
|
return;
|
|
}
|
|
if (file.print(message)) {
|
|
Serial.println("Message appended");
|
|
} else {
|
|
Serial.println("Append failed");
|
|
}
|
|
file.close();
|
|
}
|
|
|
|
void renameFile(const char * path1, const char * path2) {
|
|
Serial.printf("Renaming file %s to %s\n", path1, path2);
|
|
if (LittleFS.rename(path1, path2)) {
|
|
Serial.println("File renamed");
|
|
} else {
|
|
Serial.println("Rename failed");
|
|
}
|
|
}
|
|
|
|
void deleteFile(const char * path) {
|
|
Serial.printf("Deleting file: %s\n", path);
|
|
if (LittleFS.remove(path)) {
|
|
Serial.println("File deleted");
|
|
} else {
|
|
Serial.println("Delete failed");
|
|
}
|
|
}
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
// We start by connecting to a WiFi network
|
|
Serial.println();
|
|
Serial.println();
|
|
Serial.print("Connecting to ");
|
|
Serial.println(ssid);
|
|
|
|
WiFi.begin(ssid, pass);
|
|
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
delay(500);
|
|
Serial.print(".");
|
|
}
|
|
Serial.println("WiFi connected");
|
|
Serial.println("IP address: ");
|
|
Serial.println(WiFi.localIP());
|
|
Serial.println("Contacting Time Server");
|
|
configTime(3600 * timezone, daysavetime * 3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org");
|
|
struct tm tmstruct ;
|
|
delay(2000);
|
|
tmstruct.tm_year = 0;
|
|
getLocalTime(&tmstruct, 5000);
|
|
Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct.tm_year) + 1900, (tmstruct.tm_mon) + 1, tmstruct.tm_mday, tmstruct.tm_hour, tmstruct.tm_min, tmstruct.tm_sec);
|
|
Serial.println("");
|
|
Serial.println("Formatting LittleFS filesystem");
|
|
LittleFS.format();
|
|
Serial.println("Mount LittleFS");
|
|
if (!LittleFS.begin()) {
|
|
Serial.println("LittleFS mount failed");
|
|
return;
|
|
}
|
|
listDir("/");
|
|
deleteFile("/hello.txt");
|
|
writeFile("/hello.txt", "Hello ");
|
|
appendFile("/hello.txt", "World!\n");
|
|
listDir("/");
|
|
|
|
Serial.println("The timestamp should be valid above");
|
|
|
|
Serial.println("Now unmount and remount and perform the same operation.");
|
|
Serial.println("Timestamp should be valid, data should be good.");
|
|
LittleFS.end();
|
|
Serial.println("Now mount it");
|
|
if (!LittleFS.begin()) {
|
|
Serial.println("LittleFS mount failed");
|
|
return;
|
|
}
|
|
readFile("/hello.txt");
|
|
listDir("/");
|
|
|
|
|
|
}
|
|
|
|
void loop() { }
|
|
|