2017-07-09 84 views
0

我正在使用libssh2 lib与设备进行SFTP会话。libssh2 - 使用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是writen到缓冲器中,该文件的字节数有〜98KB (99999字节),但libssh2_sftp_read函数返回30000到x

+0

您是否检查过'libssh2_sftp_read'实际返回的内容?您试图阅读的文件,它是什么类型的文件?它的内容是什么?它是一个可以包含嵌入零的二进制文件吗?如果它是一个二进制文件,那么不要使用文本输出(如'cout << output'等)。您收到的数据的目的是什么?你应该如何使用这些数据? –

+0

''libssh2_sftp_read'和'memcpy'都不会在'\ 0'处停止,您应该检查'x'。 –

+0

开始使用'std :: string'并打印出来,'(const)char *'的'operator <<'将停在'\ 0'处。 –

回答

1

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

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

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

+0

一个问题是'libssh2_sftp_read()'返回30000,输出有224个字节。 –

+0

@ Samega7Cattac这是什么意思*“输出有224个字节”*?无论如何,你的问题在哪里提供这些信息? –