Skip to content

LittleFS.setTimeCallback only sets file creation time, not lastWrite #7775

Closed
@alka79

Description

@alka79

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

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions