FluentFTP: GetListing does not handle spaces in filenames as expected - use machine listings as default

FTP OS: Unix

FTP Server: Pure-FTPd

Computer OS: ? Windows 10

FluentFTP Version: ? Various 34.0.1, 34.0.0, 30.0.0

Create the following file structure.

file-4 is a chroot for a virtual user. Debian Buster: pure-ftpd/stable,now 1.0.47-3 amd64 [installed]

/file-4
/file-4/previews & style/crossdomain.xml
/file-4/previews/20150(408163454.jpg
/file-4/previews/20150408163454.jpg
/file-4/previews/20160313923123.jpg
/file-4/perviews/crossdomain.xml

DeleteDirectory() of /file-4 fails with 550:Could not delete /file-4/previews & style/20150(408163454.jpg: No such file or directory

FtpClient.GetListing(StoragePath + “/previews & style/”, FtpListOption.ForceList | FtpListOption.Recursive); Running the above command produces a listing wit 4 files in it.

"/file-4/previews & style/20150(408163454.jpg"
"/file-4/previews & style/20150408163454.jpg"
"/file-4/previews & style/20160313923123.jpg"
"/file-4/previews & style/crossdomain.xml"

FtpClient.GetListing(StoragePath + “/preview”, FtpListOption.ForceList | FtpListOption.Recursive); No Results

FtpClient.GetListing(StoragePath + “/previews”, FtpListOption.ForceList | FtpListOption.Recursive);

"/file-4/previews/20150(408163454.jpg"
"/file-4/previews/20150408163454.jpg"
"/file-4/previews/20160313923123.jpg"
"/file-4/previews/crossdomain.xml"

FtpClient.GetListing(StoragePath + “/previews any text i like”, FtpListOption.ForceList | FtpListOption.Recursive);

"/file-4/previews any text i like/20150(408163454.jpg"
"/file-4/previews any text i like/20150408163454.jpg"
"/file-4/previews any text i like/20160313923123.jpg"
"/file-4/previews any text i like/crossdomain.xml"

Logs :

# GetWorkingDirectory()

# Connect()
Status:   Connecting to ***:21
Response: 220-XXX server.
Response: 220-Unauthorised access is not permitted.
Response: 220 This is a private system - No anonymous login
Command:  AUTH TLS
Response: 234 AUTH TLS OK.
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0999281.
Command:  USER ***
Response: 331 User *** OK. Password required
Command:  PASS ***
Response: 230 OK. Current directory is /
Command:  PBSZ 0
Response: 200 PBSZ=0
Command:  PROT P
Response: 200 Data protection level set to "private"
Command:  FEAT
Response: 211-Extensions supported:
Response: EPRT
Response: IDLE
Response: MDTM
Response: SIZE
Response: MFMT
Response: REST STREAM
Response: MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
Response: MLSD
Response: AUTH TLS
Response: PBSZ
Response: PROT
Response: UTF8
Response: TVFS
Response: ESTA
Response: PASV
Response: EPSV
Response: SPSV
Response: 211 End.
Status:   Text encoding: System.Text.UTF8Encoding
Command:  OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Command:  SYST
Response: 215 UNIX Type: L8
Command:  PWD
Response: 257 "/" is your current location

# GetListing("/file-4/previews any text i like/", ForceList)
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST /file-4/previews any text i like", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||2690|)
Status:   Connecting to ***:2690
Command:  LIST /file-4/previews any text i like
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0069988.
+---------------------------------------+
Listing:  /file-4/previews:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:58 20150(408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:58 20150408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:58 20160313923123.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:58 crossdomain.xml
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226-Options: -l
Response: 226 4 matches total
Status:   Disposing FtpSocketStream...
Status:   Not in UNIX format
Status:   Not in UNIX format
Status:   Not in Windows format
Status:   Not in OS/400 format
Status:   Not in VMS format
Status:   Could not detect format. Using default Unix
Warning:  Failed to parse file listing: /file-4/previews:
Status:   Confirmed format Unix

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 17 (6 by maintainers)

Commits related to this issue

Most upvoted comments

Sorry for never getting back to you. We recently did an upgrade to latest FluentFTP and our tests which cover this pass. So definitely all good.

Rereading this issue now, I don’t even know how I managed that analysis but I’m glad it helped.

MLSD supports spaces in the name, which is why it works as expected.

# OpenPassiveDataStream(AutoPassive, "MLSD /file-4/previews & style", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||37199|)
Status:   Connecting to ***:37199
Command:  MLSD /file-4/previews & style
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0070004.
+---------------------------------------+
Listing:  type=cdir;sizd=4096;modify=20210719223144;UNIX.mode=0755;UNIX.uid=1001;UNIX.gid=1001;unique=fe01ga0021; .
Listing:  type=pdir;sizd=4096;modify=20210719075128;UNIX.mode=0755;UNIX.uid=1001;UNIX.gid=1001;unique=fe01ga0001; ..
Listing:  type=file;size=0;modify=20210719223144;UNIX.mode=0644;UNIX.uid=0;UNIX.gid=0;unique=fe01ga0014; d
-----------------------------------------
Status:   Disposing FtpSocketStream...

Running the Delete on 34.0.1.

# DeleteDirectory("file-4")

# GetWorkingDirectory()

# Connect()
Status:   Connecting to ***:21
Response: 220-XXX server.
Response: 220-Unauthorised access is not permitted.
Response: 220 This is a private system - No anonymous login
Command:  AUTH TLS
Response: 234 AUTH TLS OK.
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0773762.
Command:  USER ***
Response: 331 User *** OK. Password required
Command:  PASS ***
Response: 230 OK. Current directory is /
Command:  PBSZ 0
Response: 200 PBSZ=0
Command:  PROT P
Response: 200 Data protection level set to "private"
Command:  FEAT
Response: 211-Extensions supported:
Response: EPRT
Response: IDLE
Response: MDTM
Response: SIZE
Response: MFMT
Response: REST STREAM
Response: MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
Response: MLSD
Response: AUTH TLS
Response: PBSZ
Response: PROT
Response: UTF8
Response: TVFS
Response: ESTA
Response: PASV
Response: EPSV
Response: SPSV
Response: 211 End.
Status:   Text encoding: System.Text.UTF8Encoding
Command:  OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Command:  SYST
Response: 215 UNIX Type: L8
Command:  PWD
Response: 257 "/" is your current location

# GetListing("/file-4/", ForceList)
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST /file-4", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||46373|)
Status:   Connecting to ***:46373
Command:  LIST /file-4
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.005964.
+---------------------------------------+
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:44 AsS5H91R.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:45 path
Listing:  drwxr-xr-x    2 0          0                4096 Jul 19 16:45 preview
Listing:  drwxr-xr-x    2 0          0                4096 Jul 19 16:45 preview a
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:44 squid1.jpg
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226-Options: -l
Response: 226 5 matches total
Status:   Disposing FtpSocketStream...
Status:   Confirmed format Unix

# GetListing("/file-4/preview a/", ForceList)
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST /file-4/preview a", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||42866|)
Status:   Connecting to ***:42866
Command:  LIST /file-4/preview a
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0179666.
+---------------------------------------+
Listing:  /file-4/preview:
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 a
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 b
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226-Options: -l
Response: 226 2 matches total
Status:   Disposing FtpSocketStream...
Warning:  Failed to parse file listing: /file-4/preview:

# GetListing("/file-4/preview/", ForceList)
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST /file-4/preview", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||10979|)
Status:   Connecting to ***:10979
Command:  LIST /file-4/preview
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0064293.
+---------------------------------------+
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 a
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 b
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226-Options: -l
Response: 226 2 matches total
Status:   Disposing FtpSocketStream...

# GetListing("/file-4/path/", ForceList)
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST /file-4/path", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||55451|)
Status:   Connecting to ***:55451
Command:  LIST /file-4/path
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.006007.
+---------------------------------------+
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226-Options: -l
Response: 226 0 matches total
Status:   Disposing FtpSocketStream...

# DeleteFile("/file-4/preview a/a")
Command:  DELE /file-4/preview a/a
Response: 550 Could not delete /file-4/preview a/a: No such file or directory

The key difference I can see here is that we don’t use recursive, so when “LIST /preview a” is submitted, you get the wrong answer.

I’m surprised with all the recursive and alternative listing commands that it’s defaulting to the non-recursive version.

Listing on 19.1.2, is also broken, as you indicated.

# GetListing("file-4/previews & style", ForceList, Recursive)

# GetWorkingDirectory()

# Connect()
Status:   Connecting to ***:21
Response: 220 This is a private system - No anonymous login
Response: 220-XXX server.
Response: 220-Unauthorised access is not permitted.
Command:  AUTH TLS
Response: 234 AUTH TLS OK.
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.1585597.
Command:  USER ***
Response: 331 User *** OK. Password required
Command:  PASS ***
Response: 230 OK. Current directory is /
Command:  PBSZ 0
Response: 200 PBSZ=0
Command:  PROT P
Response: 200 Data protection level set to "private"
Command:  FEAT
Response: 211 End.
Response: 211-Extensions supported:
Response: EPRT
Response: IDLE
Response: MDTM
Response: SIZE
Response: MFMT
Response: REST STREAM
Response: MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
Response: MLSD
Response: AUTH TLS
Response: PBSZ
Response: PROT
Response: UTF8
Response: TVFS
Response: ESTA
Response: PASV
Response: EPSV
Response: SPSV
Status:   Text encoding: System.Text.UTF8Encoding
Command:  OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Command:  SYST
Response: 215 UNIX Type: L8
Status:   Auto-detected UNIX listing parser
Command:  PWD
Response: 257 "/" is your current location
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST -R /file-4/previews & style", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||42587|)
Status:   Connecting to ***:42587
Command:  LIST -R /file-4/previews & style
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0089974.
+---------------------------------------+
Listing:  /file-4/previews:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 20150(408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20150408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20160313923123.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 crossdomain.xml
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226 4 matches total
Response: 226-Options: -l -R
Status:   Disposing FtpSocketStream...
Status:   Confirmed format Unix
'testhost.x86.exe' (CLR v4.0.30319: domain-4683f65d-SentinelBackend.Tests.dll): Loaded 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
The thread 0x42f0 has exited with code 0 (0x0).
The thread 0x6164 has exited with code 0 (0x0).

However the delete method behaved in a different way on 19.1.2 and did not fail. It gets it correct, because the folder that it’s initially deleting does not have a space, so it correctly lists the subfolders. 34.0.1 could not do that. I’ll post that in a minute.

# DeleteDirectory("file-4")
Status:   Testing connectivity using Socket.Poll()...

# GetListing("file-4", ForceList, Recursive)

# GetWorkingDirectory()
Status:   Testing connectivity using Socket.Poll()...
Command:  PWD
Response: 257 "/" is your current location
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST -R /file-4", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||24476|)
Status:   Connecting to ***:24476
Command:  LIST -R /file-4
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0101372.
+---------------------------------------+
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 15:44 0bnoHTKq.jpg
Listing:  drwxr-xr-x    3 1001       ftp              4096 Jul 16 14:58 2016
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 2016-01-39T231232.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 16:39 20160313923123.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 16:25 30nN7kNW.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:16 48zx0e1y.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 16:49 6YfXZuvm.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 16:17 9G2eynk3.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:05 As9vbtBi.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:51 Azowo2ym.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 14:45 BxMwTq2U.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 22:42 CAJvSV0m.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:29 CxQkUvya.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:05 G5bh1Ov6.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 14:44 GoItISL2.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 22:43 H7JpR15h.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 HelloWorld
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:16 IdXOuV5L.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:17 IvaAip4W.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 14:43 LMxRK4Cr.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 17:21 LPE4GDHF.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 LatestPhoto
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:04 N9UQFbLh.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 16:23 NxVuywGF.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 16:43 O90Rmo7T.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:47 OqLwDolA.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 16:23 PKxETXo6.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 17:22 QmiqAPgP.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 22:42 SO3cZJ56.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 07:49 Skl0SrAy.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:33 Tom Installation
Listing:  drwxr-xr-x    3 1001       ftp              4096 Jul 16 14:58 Tom's Installation
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:33 Tom, Russ, Michael
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 16:20 UclwH95W.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:48 UgxyFiZg.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 11:03 VNbBilNU.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 16:18 WJtukOmg.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 16:11 YDdBmKFR.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 07:53 YYElM8OF.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 17:22 ZBuRWEUm.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 16:19 ZC17HqSO.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:06 aO6r7yY8.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 cross#domain.xml
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 crossdomain.xml
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 18 22:42 eW5CVfCC.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:23 gqdsMNaG.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 img
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 16:21 jvAr3k45.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:18 kUouz80u.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 10:31 ljexXx7m.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 15:04 luovD4R1.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 19 10:48 lzrhbTGL.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 18 17:36 mWpH13KB.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 15:38 nbuWNKYG.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:38 oCDiEAK8.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 16 10:31 path
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 10:31 pathsquid1.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:33 previews
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 previews & style
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 16:24 rPLXm5RL.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:50 sJozbshp.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:33 some
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 somepath
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 10:31 squid1.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 thumbs
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 10:59 ugWrm1db.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 15:10 vEOohgKb.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:52 vsqxksJs.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 15:50 wIAyFaAx.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 18 17:33 wqDmDrhN.jpg
Listing:  -rw-r--r--    1 1001       ftp                32 Jul 16 14:43 xdwpndGm.jpg
Listing:  /file-4/2016:
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 Mar
Listing:  /file-4/2016/Mar:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20160313923123.jpg
Listing:  /file-4/LatestPhoto:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 LatestPhoto.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 LatestPhoto.txt
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 LatestThumb.jpg
Listing:  /file-4/Tom Installation:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 20160313923123.jpg
Listing:  /file-4/Tom's Installation:
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:32 Mar
Listing:  /file-4/Tom's Installation/Mar:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20160313923123.jpg
Listing:  /file-4/Tom, Russ, Michael:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 20160313923123.jpg
Listing:  /file-4/img:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 something.txt
Listing:  /file-4/path:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 16 10:31 squid2.jpg
Listing:  /file-4/previews:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 20150(408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20150408163454.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20160313923123.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 crossdomain.xml
Listing:  /file-4/previews & style:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 crossdomain.xml
Listing:  /file-4/some:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:33 path
Listing:  /file-4/thumbs:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 20160313923123.jpg
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:32 crossdomain.xml
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226 90 matches total
Response: 226-Options: -l -R
Status:   Disposing FtpSocketStream...

#... 

# DeleteFile("/file-4/previews/20150(408163454.jpg")
Command:  DELE /file-4/previews/20150(408163454.jpg
Response: 250 Deleted /file-4/previews/20150(408163454.jpg

# DeleteFile("/file-4/previews/20150408163454.jpg")
Command:  DELE /file-4/previews/20150408163454.jpg
Response: 250 Deleted /file-4/previews/20150408163454.jpg

# DeleteFile("/file-4/previews/20160313923123.jpg")
Command:  DELE /file-4/previews/20160313923123.jpg
Response: 250 Deleted /file-4/previews/20160313923123.jpg

# DeleteFile("/file-4/previews/crossdomain.xml")
Command:  DELE /file-4/previews/crossdomain.xml
Response: 250 Deleted /file-4/previews/crossdomain.xml

# DeleteFile("/file-4/previews & style/crossdomain.xml")
Command:  DELE /file-4/previews & style/crossdomain.xml
Response: 250 Deleted /file-4/previews & style/crossdomain.xml

...

Doing the delete on 19.1.2

# DeleteDirectory("file-4")

# Connect()
Status:   Connecting to ***:21
Response: 220 This is a private system - No anonymous login
Response: 220-XXX server.
Response: 220-Unauthorised access is not permitted.
Command:  AUTH TLS
Response: 234 AUTH TLS OK.
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.2884301.
Command:  USER ***
Response: 331 User *** OK. Password required
Command:  PASS ***
Response: 230 OK. Current directory is /
Command:  PBSZ 0
Response: 200 PBSZ=0
Command:  PROT P
Response: 200 Data protection level set to "private"
Command:  FEAT
Response: 211 End.
Response: 211-Extensions supported:
Response: EPRT
Response: IDLE
Response: MDTM
Response: SIZE
Response: MFMT
Response: REST STREAM
Response: MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
Response: MLSD
Response: AUTH TLS
Response: PBSZ
Response: PROT
Response: UTF8
Response: TVFS
Response: ESTA
Response: PASV
Response: EPSV
Response: SPSV
Status:   Text encoding: System.Text.UTF8Encoding
Command:  OPTS UTF8 ON
Response: 200 OK, UTF-8 enabled
Command:  SYST
Response: 215 UNIX Type: L8
Status:   Auto-detected UNIX listing parser

# GetListing("file-4", ForceList, Recursive)

# GetWorkingDirectory()
Command:  PWD
Response: 257 "/" is your current location
Command:  TYPE I
Response: 200 TYPE is now 8-bit binary

# OpenPassiveDataStream(AutoPassive, "LIST -R /file-4", 0)
Command:  EPSV
Response: 229 Extended Passive mode OK (|||15950|)
Status:   Connecting to ***:15950
Command:  LIST -R /file-4
Response: 150 Accepted data connection
Status:   FTPS Authentication Successful
Status:   Time to activate encryption: 0h 0m 0s.  Total Seconds: 0.0090203.
+---------------------------------------+
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:44 AsS5H91R.jpg
Listing:  drwxr-xr-x    2 1001       ftp              4096 Jul 19 16:44 path
Listing:  drwxr-xr-x    2 0          0                4096 Jul 19 16:45 preview
Listing:  drwxr-xr-x    2 0          0                4096 Jul 19 16:45 preview a
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:44 squid1.jpg
Listing:  /file-4/path:
Listing:  -rw-r--r--    1 1001       ftp              2581 Jul 19 16:44 squid2.jpg
Listing:  /file-4/preview:
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 a
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 b
Listing:  /file-4/preview a:
Listing:  -rw-r--r--    1 0          0                   0 Jul 19 16:45 c
-----------------------------------------
Status:   Disposing FtpSocketStream...

# CloseDataStream()
Response: 226 9 matches total
Response: 226-Options: -l -R
Status:   Disposing FtpSocketStream...
Status:   Confirmed format Unix

# DeleteFile("/file-4/path/squid2.jpg")
Command:  DELE /file-4/path/squid2.jpg
Response: 250 Deleted /file-4/path/squid2.jpg

# DeleteFile("/file-4/preview/a")
Command:  DELE /file-4/preview/a