【发布时间】:2014-11-19 11:17:28
【问题描述】:
我正在尝试通过 sftp 下载文件,到目前为止,我已经通过 ssh 会话连接到服务器,然后使用 ssh 会话打开了一个 sftp 会话,一切似乎都很好。我在服务器上打开了一个文件,我正在使用 sftp_read() 从文件中获取字节块。我的代码是:
char buffer[16384] = {};
ssize_t nbytes;
ssize_t ntotal = 0;
for (;;) {
nbytes = sftp_read(file, buffer, sizeof(buffer));
if (nbytes == 0) {
break; // EOF
}
localFile << buffer;
ntotal += nbytes;
//sftp_seek(file, ntotal);
}
但由于某种原因,在读取块时,前 20 个字节是正确的,但第 21 个直到第 16384 个字节是错误的。事实证明,读完 20 个字节后,阅读器跳转到文件的第 16384 个字节,继续阅读,就像什么都没发生一样。
我做了一些测试,如果我将缓冲区更改为任何大小,无论是 16384、21、22、50 等,它在正确读取 20 个字节后仍会跳转到第 16384 个字节。
这是有原因的吗?有没有比 libssh 和 sftp 更好的库,我可以使用而不会出错?
【问题讨论】:
-
你没有正确写入流,使用
localFile.write(buffer, nbytes) -
我正在使用 std::ofstream 写入本地文件。我以前做过,所以语法很好。
-
问题是。本地文件
-
@asn 实际上
localFile << buffer一直写入到它遇到一个空字符,所以它实际上可以写入超过 16kB。 -
我错过的一个细节是,如果我在填充缓冲区后调试并放置一个断点,我可以看到它用字符填充了整个缓冲区,这些字符来自原始文件(I'已使用十六进制编辑器查看本地和服务器文件的字节)。 sftp_read 只返回 20 个字节,然后跳转其他 16364 个字节。甚至写入的文件输出也明显小于原始文件的大小。