2017-07-09 86 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個字節」*?無論如何,你的問題在哪裏提供這些信息? –