Skip to main content

Hello,

ich habe problems to get the file-size when i want to download a file from a ftp server.

I have the example programm from MicroFocus, i read the description for FTP-Client in the AcuCorp News from 2004. But i didn't get the file-size.

 

When i send the "RETR" command i should get back the Answer from the Server with the file-size, which i can parse.
I get back:
125 Data connection already open; Transfer starting
but no Info about the File size.

Example from MicroFocus:
               initialize unix-send-command
               move 1 to unix-send-cmd-length
               string "RETR " delimited by size
                      unix-file-path delimited by spaces
                      x"0A" delimited by size
                      into unix-send-command with pointer
                      unix-send-cmd-length
               subtract 1 from unix-send-cmd-length
               call "c$socket" using ags-write, unix-connection-handle,
                    unix-send-command, unix-send-cmd-length
               call "c$socket" using ags-flush, unix-connection-handle  
               |this will receive the server's response to the request 
               |for copying one of the manager files. 
               initialize unix-receive-command byte-hold
               move 1 to unix-receive-cmd-length
               perform until byte-hold = end-cmd-byte or
                       unix-receive-cmd-length > max-cmd-length
                  move 1 to num-bytes-read
                  call "c$socket" using ags-read,
                       unix-connection-handle, byte-hold, num-bytes-read
                  string byte-hold delimited by size into
                         unix-receive-command with pointer
                         unix-receive-cmd-length
               end-perform

end-cmd-byte =        01 end-cmd-byte                 pic x value x"0A".

When i read the RFC959 Manual for FTP - Server i see here the First Problem.
the responce from the FTP-Server can have a multiply responce and with this code i get only the First line. so i edited the code, that i can receive the full responce from the server.

From the Manual:
Thus the format for multi-line replies is that the first line
         will begin with the exact required reply code, followed
         immediately by a Hyphen, "-" (also known as Minus), followed by
         text.  The last line will begin with the same code, followed
         immediately by Space <SP>, optionally some text, and the Telnet
         end-of-line code.

            For example:
                                123-First line
                                Second line
                                  234 A line beginning with numbers
                                123 The last line

the edited code, didn't helped because i get only a single line responce from the server, not a multi-line. So still no file-size answer...

Without the File-Size i can't avoid adding excess bytes to the local file.

My next test was to get the Full List from the Server-Files and Parse the bytes from the listing i get back. But the bytes there are not the same byte-size which i get from c$fileinfo.

At the moment i have no idea to solve my problem.

Hello,

ich habe problems to get the file-size when i want to download a file from a ftp server.

I have the example programm from MicroFocus, i read the description for FTP-Client in the AcuCorp News from 2004. But i didn't get the file-size.

 

When i send the "RETR" command i should get back the Answer from the Server with the file-size, which i can parse.
I get back:
125 Data connection already open; Transfer starting
but no Info about the File size.

Example from MicroFocus:
               initialize unix-send-command
               move 1 to unix-send-cmd-length
               string "RETR " delimited by size
                      unix-file-path delimited by spaces
                      x"0A" delimited by size
                      into unix-send-command with pointer
                      unix-send-cmd-length
               subtract 1 from unix-send-cmd-length
               call "c$socket" using ags-write, unix-connection-handle,
                    unix-send-command, unix-send-cmd-length
               call "c$socket" using ags-flush, unix-connection-handle  
               |this will receive the server's response to the request 
               |for copying one of the manager files. 
               initialize unix-receive-command byte-hold
               move 1 to unix-receive-cmd-length
               perform until byte-hold = end-cmd-byte or
                       unix-receive-cmd-length > max-cmd-length
                  move 1 to num-bytes-read
                  call "c$socket" using ags-read,
                       unix-connection-handle, byte-hold, num-bytes-read
                  string byte-hold delimited by size into
                         unix-receive-command with pointer
                         unix-receive-cmd-length
               end-perform

end-cmd-byte =        01 end-cmd-byte                 pic x value x"0A".

When i read the RFC959 Manual for FTP - Server i see here the First Problem.
the responce from the FTP-Server can have a multiply responce and with this code i get only the First line. so i edited the code, that i can receive the full responce from the server.

From the Manual:
Thus the format for multi-line replies is that the first line
         will begin with the exact required reply code, followed
         immediately by a Hyphen, "-" (also known as Minus), followed by
         text.  The last line will begin with the same code, followed
         immediately by Space <SP>, optionally some text, and the Telnet
         end-of-line code.

            For example:
                                123-First line
                                Second line
                                  234 A line beginning with numbers
                                123 The last line

the edited code, didn't helped because i get only a single line responce from the server, not a multi-line. So still no file-size answer...

Without the File-Size i can't avoid adding excess bytes to the local file.

My next test was to get the Full List from the Server-Files and Parse the bytes from the listing i get back. But the bytes there are not the same byte-size which i get from c$fileinfo.

At the moment i have no idea to solve my problem.

i found another way...

i request the file size before i send the "retr" command.

with "size" i can ask the server for the file size... i have to modify my parser. But i think it will work.


Hello,

ich habe problems to get the file-size when i want to download a file from a ftp server.

I have the example programm from MicroFocus, i read the description for FTP-Client in the AcuCorp News from 2004. But i didn't get the file-size.

 

When i send the "RETR" command i should get back the Answer from the Server with the file-size, which i can parse.
I get back:
125 Data connection already open; Transfer starting
but no Info about the File size.

Example from MicroFocus:
               initialize unix-send-command
               move 1 to unix-send-cmd-length
               string "RETR " delimited by size
                      unix-file-path delimited by spaces
                      x"0A" delimited by size
                      into unix-send-command with pointer
                      unix-send-cmd-length
               subtract 1 from unix-send-cmd-length
               call "c$socket" using ags-write, unix-connection-handle,
                    unix-send-command, unix-send-cmd-length
               call "c$socket" using ags-flush, unix-connection-handle  
               |this will receive the server's response to the request 
               |for copying one of the manager files. 
               initialize unix-receive-command byte-hold
               move 1 to unix-receive-cmd-length
               perform until byte-hold = end-cmd-byte or
                       unix-receive-cmd-length > max-cmd-length
                  move 1 to num-bytes-read
                  call "c$socket" using ags-read,
                       unix-connection-handle, byte-hold, num-bytes-read
                  string byte-hold delimited by size into
                         unix-receive-command with pointer
                         unix-receive-cmd-length
               end-perform

end-cmd-byte =        01 end-cmd-byte                 pic x value x"0A".

When i read the RFC959 Manual for FTP - Server i see here the First Problem.
the responce from the FTP-Server can have a multiply responce and with this code i get only the First line. so i edited the code, that i can receive the full responce from the server.

From the Manual:
Thus the format for multi-line replies is that the first line
         will begin with the exact required reply code, followed
         immediately by a Hyphen, "-" (also known as Minus), followed by
         text.  The last line will begin with the same code, followed
         immediately by Space <SP>, optionally some text, and the Telnet
         end-of-line code.

            For example:
                                123-First line
                                Second line
                                  234 A line beginning with numbers
                                123 The last line

the edited code, didn't helped because i get only a single line responce from the server, not a multi-line. So still no file-size answer...

Without the File-Size i can't avoid adding excess bytes to the local file.

My next test was to get the Full List from the Server-Files and Parse the bytes from the listing i get back. But the bytes there are not the same byte-size which i get from c$fileinfo.

At the moment i have no idea to solve my problem.

In the Sample von MicroFocus is a Error in the routine to fix the excess bytes to the local file.

           evaluate file-size-cnt

              when 1

                 move 1 to tot-1-cnt

                 perform until tot-1-cnt > file-size-cnt

                    move file-size-pos(tot-1-cnt) to

                         tot-1-pos(tot-1-cnt)

                    add 1 to tot-1-cnt

                 end-perform

                 move total-file-1 to file-total-byte-size

              when 2

                 move 1 to tot-2-cnt

                 perform until tot-2-cnt > file-size-cnt

                    move file-size-pos(tot-2-cnt) to

                         tot-2-pos(tot-2-cnt)

                    add 1 to tot-2-cnt

                 end-perform

                 move total-file-2 to file-total-byte-size

              when 3

                 move 1 to tot-3-cnt

                 perform until tot-3-cnt > file-size-cnt

                    move file-size-pos(tot-3-cnt) to

                         tot-3-pos(tot-3-cnt)

                    add 1 to tot-3-cnt

                 end-perform

                 divide total-file-3 by 500 giving division-value

                        remainder division-remainder

                 if division-remainder not = 0

                    |this will make the total byte size a number that

                    |is evenly divisible by 500.  The remainder will be

                    |dealt with once the total-byte-size number of

                    |bytes have been written to the file.

                    compute file-total-byte-size = total-file-3 -

                            division-remainder

                    move 1 to bytes-remaining-sw

                 else

                    move total-file-3 to file-total-byte-size

                    move 0 to bytes-remaining-sw

                 end-if

file-size-cnt "1" and "2" can't be divided by 500.

so in "1" and "2" the file-total-byte-size must be always zero

bytes-remaining-sw must be filled with 1

and the division-remainder must be filled with the bytes.

 

Correct example:

           evaluate file-size-cnt
              when  1
                    move 1 to tot-1-cnt
                    perform until tot-1-cnt > file-size-cnt
                       move file-size-pos(tot-1-cnt) to
                            tot-1-pos(tot-1-cnt)
                       add  1 to tot-1-cnt
                    end-perform
                    move zeroes       to file-total-byte-size
                    move total-file-1 to division-remainder
                    move            1 to bytes-remaining-sw
              when  2
                    move 1 to tot-2-cnt
                    perform until tot-2-cnt > file-size-cnt
                       move file-size-pos(tot-2-cnt) to
                            tot-2-pos(tot-2-cnt)
                       add  1 to tot-2-cnt
                    end-perform
                    move zeroes       to file-total-byte-size
                    move total-file-2 to division-remainder
                    move            1 to bytes-remaining-sw
              when  3
                    move 1 to tot-3-cnt
                    perform until tot-3-cnt > file-size-cnt
                       move file-size-pos(tot-3-cnt) to
                            tot-3-pos(tot-3-cnt)
                       add  1 to tot-3-cnt
                    end-perform
                    divide total-file-3 by 500 giving division-value
                                            remainder division-remainder
                    if division-remainder not = 0
                       compute file-total-byte-size = total-file-3
                                                    - division-remainder
                       move  1 to bytes-remaining-sw
                    else
                       move total-file-3 to file-total-byte-size
                       move 0 to bytes-remaining-sw
                    end-if