libssh2 - 使用SFTP读取文件

时间:2017-07-09 16:45:27

标签: c++ string sftp libssh2

我使用libssh2 lib与设备进行SFTP会话。

但是当我尝试读取文件并返回输出时,永远不会返回完整的文件。

我认为是因为控制字符(如\0)位于文件的中间。

代码:

sftp_handle = libssh2_sftp_open(sftp_session, filename, LIBSSH2_FXF_READ, 0);
if (!sftp_handle) return "-1";
char buf[99999];
int x = libssh2_sftp_read(sftp_handle, buf, sizeof(buf));
char * output = (char *)malloc(sizeof(char)*x);
memcpy(output, buf, x);
output[x] = '\0';
libssh2_sftp_close(sftp_handle);

************更新1 ************

我试图阅读的文件是一个几乎所有ascii字符的文本文件。

************更新2 ************

x是写入缓冲区的字节数,文件大小为~98kb(99999字节),但libssh2_sftp_read函数返回30000到x

1 个答案:

答案 0 :(得分:1)

我认为代码只是代码段,因此如果围绕基本代码段循环,则下面的注释可能不合适。

libssh2_sftp_read()可能无法读取文件的完整字节,但可以读取单个调用中可读取的最大值。因此,可能需要重复此调用,直到它返回零或扫描读取缓冲区以检查EOF字符。 [EOF检查可以使平台依赖于您的代码]。只需突出显示下面的手册页。

  

从LIBSSH2_SFTP_HANDLE读取数据块。这个方法是   在POSIX read(2)函数之后建模并使用相同的调用   语义。 libssh2_sftp_read将尝试尽可能多地读取   但是,如果文件指针到达,则可能无法填充所有缓冲区   结束或如果进一步读取会导致套接字阻塞。