我使用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
。
答案 0 :(得分:1)
我认为代码只是代码段,因此如果围绕基本代码段循环,则下面的注释可能不合适。
libssh2_sftp_read()
可能无法读取文件的完整字节,但可以读取单个调用中可读取的最大值。因此,可能需要重复此调用,直到它返回零或扫描读取缓冲区以检查EOF字符。 [EOF检查可以使平台依赖于您的代码]。只需突出显示下面的手册页。
从LIBSSH2_SFTP_HANDLE读取数据块。这个方法是 在POSIX read(2)函数之后建模并使用相同的调用 语义。 libssh2_sftp_read将尝试尽可能多地读取 但是,如果文件指针到达,则可能无法填充所有缓冲区 结束或如果进一步读取会导致套接字阻塞。