Sample code for 30+ languages & platforms
Zig

Delete Local Files that Do Not Exist on the FTP Server

See more FTP Examples

Demonstrates how to get a list of local files in a directory tree that do not exist on the FTP server.

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("login");
    ftp.setPassword("password");

    ftp.setKeepSessionLog(true);

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

    // Set the current remote directory to the root of
    // the remote tree to be compared.
    ftp.changeRemoteDir("abc123") catch {
        std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
        return;
    };

    // Recursively descend the local directory tree
    // and find the files that exist locally but not remotely.
    // These are the files what would be uploaded via
    // the SyncRemoteTree method call with mode = 1.
    // (Mode 1 would upload all files that do not exist on the FTP server.)

    // The actual uploading is avoided by setting the preview-only argument to true.
    const mode = 1;
    const descend_tree = true;
    const preview_only = true;
    ftp.syncRemoteTree2("/temp/abc123", mode, descend_tree, preview_only) catch {
        std.debug.print("{s}\n", .{try ftp.getLastErrorText(alloc)});
        return;
    };

    // The files what would've been uploaded are now available in the SyncPreview property,
    // which contains a list of local file paths, one per line.
    // A program can iterate over them like this:
    const sa = try chilkat.StringArray.init();
    defer sa.deinit();
    sa.loadFromText(try ftp.getSyncPreview(alloc));

    const fac = try chilkat.FileAccess.init();
    defer fac.deinit();

    const num_files = sa.getCount();
    var i: i32 = 0;
    var local_file_path: [:0]const u8 = "";
    while (i < num_files) {
        local_file_path = try sa.getString(alloc, i);
        std.debug.print("{s}\n", .{local_file_path});

        // An application can delete the file using Chilkat's file access object,
        // or it can choose to use the native file API available in the programming language:
        fac.fileDelete(local_file_path) catch {
            std.debug.print("Failed to delete: {s}\n", .{local_file_path});
        };

        i = i + 1;
    }

    try ftp.disconnect();
}