【问题标题】:How to download folder or file from server using SFTP with libssh in C++?如何在 C++ 中使用带有 libssh 的 SFTP 从服务器下载文件夹或文件?
【发布时间】:2021-07-30 07:16:03
【问题描述】:

是否可以使用 SFTP 从服务器下载文件或文件夹? (C++, libssh)

我尝试在这里效仿:https://github.com/substack/libssh/blob/master/examples/samplesftp.c

但我无法下载文件/文件夹...

这是我的代码:

int AutoUpdator::sftp_read_sync(ssh_session session, sftp_session sftp, std::string path)
{
    ans_info("start sftp_read_sync");
    std::cout << path << std::endl;
    int access_type;
    sftp_file file;
    char buffer[MAX_XFER_BUF_SIZE];
    int nbytes, nwritten, rc;
    int fd;
    access_type = O_RDONLY;
    file = sftp_open(sftp, path.c_str(), access_type, 0);
    if (file == NULL) {
        fprintf(stderr, "Can't open file for reading: %s\n", ssh_get_error(session));
        return SSH_ERROR;
    }

    /* open a file for writing... */
    fd = open("/home/writing_test.txt",O_WRONLY|O_CREAT, 0700);
    if (fd < 0) {
        fprintf(stderr, "Can't open file for writing: %s\n", strerror(errno));
        return SSH_ERROR;
    }

    for (;;) {
        nbytes = sftp_read(file, buffer, sizeof(buffer));
        if (nbytes > 0) {
            std::cout << "nbytes :" << nbytes << std::endl;
            std::cout << "buffer :" << buffer << std::endl;
            server_version_ = buffer;
            ans_info("server_version : " + server_version_);
        }
        else if (nbytes == 0) {
            ans_info("EOF");
            break; // EOF
        }
        else if (nbytes < 0) {
            fprintf(stderr, "Error while reading file: %s\n", ssh_get_error(session));
            sftp_close(file);
            return SSH_ERROR;
        }
        nwritten = write(fd, buffer, nbytes);
        if (nwritten != nbytes) {
            fprintf(stderr, "Error writing: %s\n", strerror(errno));
            sftp_close(file);
            return SSH_ERROR;
        }
    }
    
    rc = sftp_close(file);
    if (rc != SSH_OK) {
        fprintf(stderr, "Can't close the read file: %s\n", ssh_get_error(session));
        return rc;
    }
    return SSH_OK;
}

这样,我可以复制一个文本文件。更准确地说,它似乎是一种复制文本内容,然后将其添加到本地文件夹中的新文本文件的方法。

我想从服务器下载一些文件。如果我可以使用 sftp 获取它,这是最好的方法。 但是如果有其他有用的方法,可以告诉我吗?

【问题讨论】:

    标签: c++ curl download sftp libssh


    【解决方案1】:

    文件夹的下载是文件夹中单个文件的下载。

    使用sftp_opendirsftp_readdir 检索文件夹中各个文件的列表。然后用你的代码一一下载文件。

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2012-11-21
      • 2022-06-18
      相关资源
      最近更新 更多