Platformio 3.4.3 ffat no data file in Build Filesystem image

Hi
I need some help.
I try to upload a file in ‘data’ folder with esp32dev
I use esp32 16MB and ‘ffat’
My data file is a small txt file.
It seems that’s working, but the file in data forder is not taken.


Did I forgot something?

How do you know? The ESP can’t mount the FFAT filesystem or the mounted filesystem is empty? What code are you using to check that.

The filesystem is ok but it’s empty.
No-data-file3

The code is :

#include "FS.h"
#include "FFat.h"

// This file should be compiled with 'Partition Scheme' (in Tools menu)
// set to 'Default with ffat' if you have a 4MB ESP32 dev module or
// set to '16M Fat' if you have a 16MB ESP32 dev module.

// You only need to format FFat the first time you run a test
#define FORMAT_FFAT true

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\r\n", dirname);

    File root = fs.open(dirname);
    if(!root){
        Serial.println("- failed to open directory");
        return;
    }
    if(!root.isDirectory()){
        Serial.println(" - not a directory");
        return;
    }

    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.path(), levels -1);
            }
        } else {
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("\tSIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\r\n", path);

    File file = fs.open(path);
    if(!file || file.isDirectory()){
        Serial.println("- failed to open file for reading");
        return;
    }

    Serial.println("- read from file:");
    while(file.available()){
        Serial.write(file.read());
    }
    file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\r\n", path);

    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    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(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\r\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("- file renamed");
    } else {
        Serial.println("- rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\r\n", path);
    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }
}

void testFileIO(fs::FS &fs, const char * path){
    Serial.printf("Testing file I/O with %s\r\n", path);

    static uint8_t buf[512];
    size_t len = 0;
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }

    size_t i;
    Serial.print("- writing" );
    uint32_t start = millis();
    for(i=0; i<2048; i++){
        if ((i & 0x001F) == 0x001F){
          Serial.print(".");
        }
        file.write(buf, 512);
    }
    Serial.println("");
    uint32_t end = millis() - start;
    Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
    file.close();

    file = fs.open(path);
    start = millis();
    end = start;
    i = 0;
    if(file && !file.isDirectory()){
        len = file.size();
        size_t flen = len;
        start = millis();
        Serial.print("- reading" );
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            if ((i++ & 0x001F) == 0x001F){
              Serial.print(".");
            }
            len -= toRead;
        }
        Serial.println("");
        end = millis() - start;
        Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
        file.close();
    } else {
        Serial.println("- failed to open file for reading");
    }
}

void setup(){
    Serial.begin(115200);
    Serial.setDebugOutput(true);
    if (FORMAT_FFAT) FFat.format();
    if(!FFat.begin()){
        Serial.println("FFat Mount Failed");
        return;
    }

    Serial.printf("Total space: %10u\n", FFat.totalBytes());
    Serial.printf("Free space: %10u\n", FFat.freeBytes());
    listDir(FFat, "/", 0);
//  writeFile(FFat, "/hello.txt", "Hello ");
//  appendFile(FFat, "/hello.txt", "World!\r\n");  //readFile(FFat, "/hello.txt");
//  renameFile(FFat, "/hello.txt", "/foo.txt");
//  readFile(FFat, "/foo.txt");
//  deleteFile(FFat, "/foo.txt");
//  testFileIO(FFat, "/test.txt");
//  Serial.printf("Free space: %10u\n", FFat.freeBytes());
//  deleteFile(FFat, "/test.txt");
//  Serial.println("Test complete");
}

void loop(){

}

And you also executed the “Upload Filesystem Image” task right?

Yes,
1 upload
2 build Filesystem Image
but when Build Filesystem Image
The next line is missing, I expected to see the file \stationslist.txt. Correct?
3 Upload Filesystem Image.

No, no such line would be printed.

$ pio run -t buildfs
Processing esp32dev (platform: espressif32; board: esp32dev; framework: arduino)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32dev.html
PLATFORM: Espressif 32 (6.0.0) > Espressif ESP32 Dev Module
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20006.221224 (2.0.6) 
 - tool-esptoolpy @ 1.40400.0 (4.4.0) 
 - tool-mkfatfs @ 2.0.1 
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Building FS image from 'data' directory to .pio/build/esp32dev/fatfs.bin
=================[SUCCESS] Took 0.49 seconds =================

Irregardless, in a minimum reproduction of the project, my data/test.txt and content is perfectly there in the generated fatfs.bin.

$ hexdump -C .pio/build/esp32dev/fatfs.bin 
00000000  eb fe 90 4d 53 44 4f 53  35 2e 30 00 10 01 01 00  |...MSDOS5.0.....|
00000010  01 00 02 5f 01 f8 01 00  3f 00 ff 00 00 00 00 00  |..._....?.......|
00000020  00 00 00 00 80 00 29 86  76 9a 56 4e 4f 20 4e 41  |......).v.VNO NA|
00000030  4d 45 20 20 20 20 46 41  54 20 20 20 20 20 00 00  |ME    FAT     ..|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001000  f8 ff ff ff 0f 00 00 00  00 00 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000  54 45 53 54 20 20 20 20  54 58 54 20 18 00 86 76  |TEST    TXT ...v|
00002010  9a 56 00 00 00 00 86 76  9a 56 02 00 12 00 00 00  |.V.....v.V......|
00002020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00006000  53 6f 6d 65 20 74 65 73  74 20 63 6f 6e 74 65 6e  |Some test conten|
00006010  74 0a 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |t...............|
00006020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00007000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
0015f000

The most reasonable explanation is that you have

So it’ll format the partition, erasing the previous content…

You need to absolutely set this macro to false, reupload the firmware and reupload the filesystem.

Please excuse me I am very new with platformio.
And I compared with spiffs where I can see the file /stationslist.txt

At the first start flash must be formated, and then not …
I just changed these two lines
//if (FORMAT_FFAT) FFat.format();
if(!FFat.begin(FORMAT_FFAT)){
It’s working.
Thank you for your patience.

With SPIFFS it’s shown because the mkspiffs has different output behavior indeed than mkffat.