Sample code for 30+ languages & platforms
Zig

FTP Non-Recursive Sync Directory (Download)

See more FTP Examples

Download files from the server that have filenames matchhing a pattern, and don't yet exist in a local directory.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    const ftp = try chilkat.Ftp2.init();
    defer ftp.deinit();

    ftp.setHostname("ftp.example.com");
    ftp.setUsername("myUsername");
    ftp.setPassword("myPassword");
    ftp.setPort(21);
    ftp.setAuthTls(true);

    // Connect and login to the FTP server.
    ftp.connect() catch {
        std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
        return;
    };

    // Change to the remote directory where the files are located.
    // This step is only necessary if the files are not in the root directory
    // of the FTP account.
    ftp.changeRemoteDir("qa") catch {
        std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
        return;
    };

    // Indicate that we only want to download files with filenames ending in ".txt"
    ftp.setSyncMustMatch("*.txt");

    // Modes for synchronization are as follows:
    // mode=0: Download all files
    // mode=1: Download all files that do not exist on the local filesystem.
    // mode=2: Download newer or non-existant files.
    // mode=3: Download only newer files. If a file does not already exist on the local filesystem, it is not downloaded from the server.
    // mode=5: Download only missing files or files with size differences.
    // mode=6: Same as mode 5, but also download newer files.
    // mode=99: Do not download files, but instead delete remote files that do not exist locally.
    const mode = 1;

    // Download all files matching "*.txt" from the current remote ftp directory.
    // The files are downloaded into c:/temp/qa_output
    ftp.syncLocalDir("c:/temp/qa_output", mode) catch {
        std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
        return;
    };

    // Perhaps we wish to delete the files we just downloaded from the server..
    const st = try chilkat.StringTable.init();
    defer st.deinit();
    ftp.getSyncedFiles(st);

    const num_files = st.getCount();
    var i: i32 = 0;
    var remote_filename: [:0]const u8 = "";
    while (i < num_files) {
        remote_filename = try st.stringAt(alloc, i);
        std.debug.print("Deleting {s} from the FTP server\n", .{remote_filename});
        ftp.deleteRemoteFile(remote_filename) catch {
            std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
            return;
        };

        i = i + 1;
    }

    try ftp.disconnect();
}