Skip to content

Commit 40599ea

Browse files
committed
Enhance FtpServer to support NLST command by modifying file listing behavior #86
1 parent 3ec6dd2 commit 40599ea

File tree

1 file changed

+69
-60
lines changed

1 file changed

+69
-60
lines changed

FtpServer.cpp

Lines changed: 69 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)