Sample code for 30+ languages & platforms
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

Lianja
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