Sample code for 30+ languages & platforms
C

Read Text at a 32-bit Offset from a Remote SFTP File

See more SFTP Examples

Demonstrates the Chilkat SFtp.ReadFileText32 method, which reads up to a number of bytes from a specific 32-bit byte offset of an open handle and decodes them to text. The arguments are the handle, the offset, the maximum number of bytes, and the charset.

Background: Reading from an explicit offset lets you fetch just the part of a file you need — a header, a record at a known position, a slice of a large log — without downloading everything before it. As with offset writes, the offset counts bytes rather than characters, so it must respect the encoded width of any multibyte content.

Chilkat C Downloads

C
#include <C_CkSFtp.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkSFtp sftp;
    int port;
    const char *password;
    const char *handle;
    int offset;
    int numBytes;
    const char *text;

    success = FALSE;

    //  Demonstrates the SFtp.ReadFileText32 method, which reads up to a number of bytes from a
    //  specific 32-bit byte offset of an open handle and decodes them to text.  The 1st argument is
    //  the handle, the 2nd is the offset, the 3rd is the maximum number of bytes, and the 4th is the
    //  charset.

    sftp = CkSFtp_Create();

    //  Connect, authenticate, and initialize the SFTP subsystem.
    port = 22;
    success = CkSFtp_Connect(sftp,"sftp.example.com",port);
    if (success == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    //  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.
    password = "mySshPassword";

    success = CkSFtp_AuthenticatePw(sftp,"mySshLogin",password);
    if (success == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    success = CkSFtp_InitializeSftp(sftp);
    if (success == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    handle = CkSFtp_openFile(sftp,"subdir/record.dat","readOnly","openExisting");
    if (CkSFtp_getLastMethodSuccess(sftp) == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    //  Read 5 bytes starting at byte offset 10, without first reading the bytes before it.
    offset = 10;
    numBytes = 5;
    text = CkSFtp_readFileText32(sftp,handle,offset,numBytes,"utf-8");
    if (CkSFtp_getLastMethodSuccess(sftp) == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    printf("%s\n",text);

    success = CkSFtp_CloseHandle(sftp,handle);
    if (success == FALSE) {
        printf("%s\n",CkSFtp_lastErrorText(sftp));
        CkSFtp_Dispose(sftp);
        return;
    }

    CkSFtp_Disconnect(sftp);


    CkSFtp_Dispose(sftp);

    }