@@ -1786,6 +1786,9 @@ bool FtpServer::doList()
17861786#endif
17871787 return false ;
17881788 }
1789+
1790+ // Determine if current transfer is NLST (name list) so we only send filenames
1791+ bool isNlst = (transferStage == FTP_Nlst);
17891792#if STORAGE_TYPE == STORAGE_SPIFFS
17901793 #if ESP8266
17911794 if ( dir.next ())
@@ -1795,25 +1798,17 @@ bool FtpServer::doList()
17951798 #endif
17961799 {
17971800
1798- // data.print( F("+r,s") );
1799- // #if ESP8266
1800- // data.print( long( dir.fileSize()) );
1801- // data.print( F(",\t") );
1802- // data.println( dir.fileName() );
1803- // #else
1804- // data.print( long( fileDir.size()) );
1805- // data.print( F(",\t") );
1806- // data.println( fileDir.name() );
1807- // #endif
1808-
1809-
1810-
18111801#ifdef ESP8266
18121802 String fn = dir.fileName ();
18131803 long fz = long ( dir.fileSize ());
18141804 if (fn[0 ]==' /' ) { fn.remove (0 , fn.lastIndexOf (" /" )+1 ); }
18151805 time_t time = dir.fileTime ();
1816- generateFileLine (&data, false , fn.c_str (), fz, time, this ->user );
1806+ if (isNlst) {
1807+ data.println (fn.c_str ());
1808+ DEBUG_PRINTLN (fn);
1809+ } else {
1810+ generateFileLine (&data, false , fn.c_str (), fz, time, this ->user );
1811+ }
18171812#else
18181813 long fz = long ( fileDir.size ());
18191814 const char * fnC = fileDir.name ();
@@ -1825,7 +1820,12 @@ bool FtpServer::doList()
18251820 }
18261821
18271822 time_t time = fileDir.getLastWrite ();
1828- generateFileLine (&data, false , fn, fz, time, this ->user );
1823+ if (isNlst) {
1824+ data.println (fn);
1825+ DEBUG_PRINTLN (fn);
1826+ } else {
1827+ generateFileLine (&data, false , fn, fz, time, this ->user );
1828+ }
18291829
18301830#endif
18311831
@@ -1836,7 +1836,7 @@ bool FtpServer::doList()
18361836 #if defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)
18371837 if ( dir.next ())
18381838 #else
1839- #if STORAGE_TYPE == STORAGE_SEEED_SD
1839+ #if STORAGE_TYPE == STORAGE_SEEED_SD
18401840 File fileDir = STORAGE_MANAGER.open (dir.name ());
18411841 fileDir = dir.openNextFile ();
18421842#else
@@ -1847,26 +1847,26 @@ bool FtpServer::doList()
18471847 {
18481848
18491849 #if defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)
1850- long fz = long ( dir.fileSize ());
1850+ long fz = long ( dir.fileSize ());
18511851// const char* fn = dir.fileName().c_str();
1852- String aza = dir.fileName ();
1852+ String aza = dir.fileName ();
18531853 const char * fn = aza.c_str (); // Serial.printf("test %s ", fn);
18541854
18551855// data.print( long( dir.fileSize()) );
18561856// data.print( F(",\t") );
18571857// data.println( dir.fileName() );
18581858 #elif STORAGE_TYPE == STORAGE_SEEED_SD
1859- const char * fnC = fileDir.name ();
1860- const char * fn;
1861- if ( fnC[0 ] == ' /' ) {
1862- fn = &fnC[1 ];
1863- }else {
1864- fn = fnC;
1865- }
1866- long fz = fileDir.size ();
1859+ const char * fnC = fileDir.name ();
1860+ const char * fn;
1861+ if ( fnC[0 ] == ' /' ) {
1862+ fn = &fnC[1 ];
1863+ }else {
1864+ fn = fnC;
1865+ }
1866+ long fz = fileDir.size ();
18671867 #else
1868- long fz = long ( fileDir.size ());
1869- const char * fn = fileDir.name ();
1868+ long fz = long ( fileDir.size ());
1869+ const char * fn = fileDir.name ();
18701870
18711871// data.print( long( fileDir.size()) );
18721872// data.print( F("\t") );
@@ -1876,15 +1876,20 @@ bool FtpServer::doList()
18761876// DEBUG_PRINT( F("\t") );
18771877// DEBUG_PRINTLN( fileDir.name() );
18781878 #endif
1879- #if defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)
1880- time_t time = dir.fileTime ();
1881- generateFileLine (&data, dir.isDirectory (), fn, fz, time, this ->user );
1882- #elif ESP32
1883- time_t time = fileDir.getLastWrite ();
1884- generateFileLine (&data, fileDir.isDirectory (), fn, fz, time, this ->user );
1885- #else
1886- generateFileLine (&data, fileDir.isDirectory (), fn, fz, " Jan 01 00:00" , this ->user );
1887- #endif
1879+ if (isNlst) {
1880+ data.println (fn);
1881+ DEBUG_PRINTLN (fn);
1882+ } else {
1883+ #if defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)
1884+ time_t time = dir.fileTime ();
1885+ generateFileLine (&data, dir.isDirectory (), fn, fz, time, this ->user );
1886+ #elif ESP32
1887+ time_t time = fileDir.getLastWrite ();
1888+ generateFileLine (&data, fileDir.isDirectory (), fn, fz, time, this ->user );
1889+ #else
1890+ generateFileLine (&data, fileDir.isDirectory (), fn, fz, " Jan 01 00:00" , this ->user );
1891+ #endif
1892+ }
18881893 nbMatch ++;
18891894 return true ;
18901895 }
@@ -1893,19 +1898,24 @@ bool FtpServer::doList()
18931898 if ( fileDir )
18941899 {
18951900
1896- // data.print( F("+r,s") );
1897- // data.print( long( fileDir.size()) );
1898- // data.print( F(",\t") );
1899- // data.println( fileDir.name() );
1900-
19011901 String fn = fileDir.name ();
19021902 if (fn[0 ]==' /' ) { fn.remove (0 , fn.lastIndexOf (" /" )+1 ); }
19031903
19041904#if STORAGE_TYPE == STORAGE_SD_MMC
19051905 time_t time = fileDir.getLastWrite ();
1906- generateFileLine (&data, fileDir.isDirectory (), fn.c_str (), long ( fileDir.size ()), time, this ->user );
1906+ if (isNlst) {
1907+ data.println (fn.c_str ());
1908+ DEBUG_PRINTLN (fn);
1909+ } else {
1910+ generateFileLine (&data, fileDir.isDirectory (), fn.c_str (), long ( fileDir.size ()), time, this ->user );
1911+ }
19071912#else
1908- generateFileLine (&data, fileDir.isDirectory (), fn.c_str (), long ( fileDir.size ()), " Jan 01 00:00" , this ->user );
1913+ if (isNlst) {
1914+ data.println (fn.c_str ());
1915+ DEBUG_PRINTLN (fn);
1916+ } else {
1917+ generateFileLine (&data, fileDir.isDirectory (), fn.c_str (), long ( fileDir.size ()), " Jan 01 00:00" , this ->user );
1918+ }
19091919#endif
19101920
19111921 nbMatch ++;
@@ -1915,34 +1925,33 @@ bool FtpServer::doList()
19151925#elif STORAGE_TYPE == STORAGE_FATFS
19161926 if ( dir.nextFile ())
19171927 {
1918- // if( dir.isDir()) {
1919- // data.print( F("+/,\t") );
1920- // } else {
1921- // data.print( F("+r,s") ); data.print( long( fileSize( file )) ); data.print( F(",\t") );
1922- // }
1923- // data.println( dir.fileName() );
19241928
19251929 String fn = dir.fileName ();
19261930 if (fn[0 ]==' /' ) { fn.remove (0 , fn.lastIndexOf (" /" )+1 ); }
19271931
1928- generateFileLine (&data, dir.isDir (), fn.c_str (), long ( dir.fileSize ()), " Jan 01 00:00" , this ->user );
1932+ if (isNlst) {
1933+ data.println (fn.c_str ());
1934+ DEBUG_PRINTLN (fn);
1935+ } else {
1936+ generateFileLine (&data, dir.isDir (), fn.c_str (), long ( dir.fileSize ()), " Jan 01 00:00" , this ->user );
1937+ }
19291938
19301939 nbMatch ++;
19311940 return true ;
19321941 }
19331942#else
19341943 if ( file.openNext ( &dir, FTP_FILE_READ_ONLY ))
19351944 {
1936- // if( file.isDir()) {
1937- // data.print( F("+/,\t") );
1938- // } else {
1939- // data.print( F("+r,s") ); data.print( long( fileSize( file )) ); data.print( F(",\t") );
1940- // }
1941-
1942- generateFileLine (&data, file.isDir (), " " , long ( fileSize ( file )), " Jan 01 00:00" , this ->user , false );
1945+ // For storages using file.printName, only send name in NLST mode
1946+ if (isNlst) {
1947+ file.printName (&data);
1948+ data.println ();
1949+ } else {
1950+ generateFileLine (&data, file.isDir (), " " , long ( fileSize ( file )), " Jan 01 00:00" , this ->user , false );
19431951
1944- file.printName ( & data );
1945- data.println ();
1952+ file.printName ( & data );
1953+ data.println ();
1954+ }
19461955 file.close ();
19471956 nbMatch ++;
19481957 return true ;
0 commit comments