How to copy a file in C/C++ with libssh and sftp

前端 未结 3 1608
迷失自我
迷失自我 2021-01-02 14:48

I\'m posting here because I need help with some code relating with libssh.

I read all the official documentation here but still I don\'t understand

相关标签:
3条回答
  • 2021-01-02 15:30

    The following example uses ifstream in a loop to avoid loading a whole file into a memory (as the accepted answer does):

    ifstream fin("C:\\myfile.zip", ios::binary);
    
    while (fin)
    {
        constexpr size_t max_xfer_buf_size = 10240
        char buffer[max_xfer_buf_size];
        fin.read(buffer, sizeof(buffer));
        if (fin.gcount() > 0)
        {
            ssize_t nwritten = sftp_write(NULL, buffer, fin.gcount());
            if (nwritten != fin.gcount())
            {
                fprintf(stderr, "Can't write data to file: %s\n", ssh_get_error(ssh_session));
                sftp_close(file);
                return 1;
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-02 15:34

    Open the file in the usual way (using C++'s fstream or C's stdio.h), read its contents to a buffer, and pass the buffer to sftp_write.

    Something like this:

    ifstream fin("file.doc", ios::binary);
    if (fin) {
      fin.seekg(0, ios::end);
      ios::pos_type bufsize = fin.tellg();   // get file size in bytes
      fin.seekg(0);                          // rewind to beginning of file
    
      std::vector<char> buf(bufsize);        // allocate buffer
      fin.read(buf.data(), bufsize);         // read file contents into buffer
    
      sftp_write(file, buf.data(), bufsize); // write buffer to remote file
    }
    

    Note that this is a very simple implementation. You should probably open the remote file in append mode, then write the data in chunks instead of sending single huge blob of data.

    0 讨论(0)
  • 2021-01-02 15:49

    I used followed the example here.

    sftp_read_sync uses an infinite loop to read a file from a server into /path/to/profile from server path /etc/profile.

    0 讨论(0)
提交回复
热议问题