Lianja
Lianja
Detect End-of-File on a Remote SFTP File
See more SFTP Examples
Demonstrates the Chilkat SFtp.Eof method, which returns whether the most recent read for a handle received the SFTP end-of-file status. The only argument is the handle. This example reads until Eof is true.
Background: The timing here is worth understanding: reading exactly through the final byte does not immediately set EOF. The next read succeeds, returns zero bytes, sets the status to
SSH_FX_EOF, and only then does Eof report true. That is why the loop tests Eof after each read rather than assuming a short read means the end — a short read can also just be the server returning less than requested.Chilkat Lianja Downloads
llSuccess = .F.
// Demonstrates the SFtp.Eof method, which returns whether the most recent read for a handle
// received the SFTP end-of-file status. The only argument is the handle.
loSftp = createobject("CkSFtp")
// Connect, authenticate, and initialize the SFTP subsystem.
lnPort = 22
llSuccess = loSftp.Connect("sftp.example.com",lnPort)
if (llSuccess = .F.) then
? loSftp.LastErrorText
release loSftp
return
endif
// Normally you would not hard-code the password in source. You should instead obtain it
// from an interactive prompt, environment variable, or a secrets vault.
lcPassword = "mySshPassword"
llSuccess = loSftp.AuthenticatePw("mySshLogin",lcPassword)
if (llSuccess = .F.) then
? loSftp.LastErrorText
release loSftp
return
endif
llSuccess = loSftp.InitializeSftp()
if (llSuccess = .F.) then
? loSftp.LastErrorText
release loSftp
return
endif
lcHandle = loSftp.OpenFile("subdir/data.txt","readOnly","openExisting")
if (loSftp.LastMethodSuccess = .F.) then
? loSftp.LastErrorText
release loSftp
return
endif
// Read until Eof reports the end of the file. Note that reading exactly through the final byte
// does not set EOF; the next read returns zero bytes and then Eof becomes true.
loSbContent = createobject("CkStringBuilder")
lnChunkSize = 4096
llReading = .T.
do while llReading
lcChunk = loSftp.ReadFileText(lcHandle,lnChunkSize,"utf-8")
if (loSftp.LastReadFailed(lcHandle)) then
? loSftp.LastErrorText
release loSftp
release loSbContent
return
endif
loSbContent.Append(lcChunk)
llReading = not loSftp.Eof(lcHandle)
enddo
llSuccess = loSftp.CloseHandle(lcHandle)
if (llSuccess = .F.) then
? loSftp.LastErrorText
release loSftp
release loSbContent
return
endif
? loSbContent.GetAsString()
loSftp.Disconnect()
release loSftp
release loSbContent