Closed
Description
Basic Infos
- [x ] This issue complies with the issue POLICY doc.
- [x ] I have read the documentation at readthedocs and the issue is not addressed there.
- [x ] I have tested that the issue is present in current master branch (aka latest git).
- [x ] I have searched the issue tracker for a similar issue.
- [x ] I have filled out all fields below.
Platform
- Hardware: [ESP-12]
- Core Version: [latest 2.7.4]
- Development Env: [Arduino IDE]
- Operating System: [Windows]
Settings in IDE
- Module: [Nodemcu]
- Flash Mode: [qio|dio|other]
- Flash Size: [4MB]
- lwip Variant: [v2 Lower Memory]
- Reset Method: [nodemcu]
- Flash Frequency: [40Mhz]
- CPU Frequency: [80Mhz]
- Upload Using: [SERIAL]
- Upload Speed: [512000] (serial upload only)
Problem Description
when set by LittleFS.setTimeCallback() , the callback function is called to set the creation time of a file but seems not called for lastWrite time.
It looks like lastWrite uses time(nullptr) which here starts at 0.
myTimeCb() function here returns a fixed date. In real life, it would be a RTC or other time provider.
MCVE Sketch
/* Example based on the LittleFS_Timestamp.ino example available at github
* MODIFIED TO USE MANUAL TIMESTAMP WITH setTimeCallback(myTimeCb)
* This sketch basically creates, appends and deletes a file named zhello.txt
* It shows that file creation date is correct but lastwrite and fileTime are not
* when using setTimeCallback().
* Key changes in the original sketch are marked around ************* comment lines
*
* Note: I tested this on a working project with LittleFS working.
* If you want to first format, uncomment the LittleFS.format(); line
*/
/* ORIGINAL SKETCH LittleFS_Timestamp.ino
/* Example showing timestamp support in LittleFS */
/* Released into the public domain. */
/* Earle F. Philhower, III <[email protected]> */
#include <FS.h>
#include <LittleFS.h>
// #include <time.h>
#include <ESP8266WiFi.h>
#ifndef STASSID
#define STASSID "..."
#define STAPSK "..."
#endif
const char *ssid = STASSID;
const char *pass = STAPSK;
// **************************
time_t myTimeCb()
{
Serial.println("--- myTimeCb was called");
return 1608231600; // 17 dec 2020 @ 19:00:00 GMT
}
// ***************************
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.println(file.size());
time_t cr = file.getCreationTime();
time_t lw = file.getLastWrite();
file.close();
time_t ft = root.fileTime();
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);
tmstruct = localtime(&ft);
Serial.printf(" fileTime : %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 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 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());
/**************************
/* no LittleFS formating for me ! */
/*
Serial.println("Formatting LittleFS filesystem");
LittleFS.format();
*/
Serial.println("Mount LittleFS");
if (!LittleFS.begin()) {
Serial.println("LittleFS mount failed");
return;
}
// ***********************************
LittleFS.setTimeCallback(myTimeCb);
// ***********************************
listDir("/");
deleteFile("/zhello.txt");
writeFile("/zhello.txt", "Hello ");
// to differentiate creation and lastwrite timestamps
Serial.println("\n...Waiting 2 secs...\n");
delay(2000);
appendFile("/zhello.txt", "World!\n");
Serial.println("");
listDir("/");
Serial.println("\nThe timestamp above show ");
Serial.println("zhello.txt creation date is as provided by myTimeCb" );
Serial.println("but lastWrite and fileTime are 01.01.1970. Probably using time(nullptr)." );
}
void loop() { }
Debug Messages
Serial output:
Mount LittleFS
Listing directory: /
FILE: zhello.txt SIZE: 13 <- present from a previous run !
CREATION : 2020-12-17 19:00:00
LAST WRITE: 1970-01-01 00:00:07
fileTime : 1970-01-01 00:00:07
Deleting file: /zhello.txt
File deleted
Writing file: /zhello.txt <- creates the file
--- myTimeCb was called <- as expected
File written
...Waiting 2 secs...
Appending to file: /zhello.txt
Message appended <- no call to myTimeCb ??
Listing directory: /
FILE: zhello.txt SIZE: 13
CREATION : 2020-12-17 19:00:00 <- as expected
LAST WRITE: 1970-01-01 00:00:07 <- not as expected
fileTime : 1970-01-01 00:00:07
The timestamps above show
zhello.txt creation date is as provided by myTimeCb
but lastWrite and fileTime are 01.01.1970. Probably using time(nullptr).
Metadata
Metadata
Assignees
Labels
No labels