Rust 如何在不将数据读入内存的情况下将ssh2::流写入文件?

Rust 如何在不将数据读入内存的情况下将ssh2::流写入文件?,rust,stream,ssh2,Rust,Stream,Ssh2,我正在尝试使用cratev0.3.3通过SCP下载一个大的二进制文件 外部板条箱ssh2; 使用std::net::TcpStream; 使用ssh2::Session; 使用std::path::path; 使用std::fs::File; 使用指示符号::ProgressBar; fn main()->结果{ 让ssh_host_port=“prokerala.com:22”; 让ssh_user=“prokeral”; 让远程_temp_file=“/tmp/dbimport_Rk6Iww

我正在尝试使用crate
v0.3.3
通过SCP下载一个大的二进制文件

外部板条箱ssh2;
使用std::net::TcpStream;
使用ssh2::Session;
使用std::path::path;
使用std::fs::File;
使用指示符号::ProgressBar;
fn main()->结果{
让ssh_host_port=“prokerala.com:22”;
让ssh_user=“prokeral”;
让远程_temp_file=“/tmp/dbimport_Rk6Iwwm5.sql.bz2”;
让tcp=TcpStream::connect(&ssh_host_port).unwrap();
让mut sess=Session::new().unwrap();
sess.handshake(&tcp).expect(“SSH握手失败”);
let=sess.userauth\u代理(ssh\u用户);
让路径=路径::新建(&远程临时文件);
let(mut remote_file,stat)=sess.scp_recv(path.unwrap();
let stream:ssh2::stream=remote_file.stream(1);
//更新:按照下面@apemanzilla的建议,使用io::copy解决
//让mut target=File::create(“/tmp/done.txt”).unwrap();
//让pb=ProgressBar::new(stat.size());
//std::io::copy(&mut pb.wrap_read(远程_文件),&mut target)?;
好(())
}


我想将
写入文件,并显示进度条。是否可以直接将
stream
写入文件,而无需在循环中使用
stream.read()
将数据读入内存?

由于
stream
实现了
read
,您应该能够使用
std::io::copy(&mut stream,&mut file::create(…).unwrap())
将所有数据复制到文件中。如果你想要一个进度条,我建议使用板条箱,它有一个,在读取数据时自动更新进度条。

由于
Stream
实现了
read
,你应该能够使用
std::io::copy(&mut Stream,&mut File::create(…).unwrap()
将所有数据复制到一个文件中。如果你想要一个进度条,我建议使用板条箱,它有一个,在读取数据时自动更新进度条。

这不是问题所问的“不使用循环中的stream.read()将数据读取到内存中?”
复制
使用缓冲区,@Stargateur如果您想高效地复制数据,您需要将数据缓冲在某个地方,并且不会比标准库提供的更简单或更快。内存中有数据到底有什么问题?我没有,但实际上你的答案是错误的,它没有回答OP问题。我不是ssh2方面的专家,但我只知道如果答案是真的,“不,你不能”是完全可以接受的。复制可能是一种方法,但需要一个缓冲区数据。@apemanzilla代码挂起在
std::io::copy(&mut-stream,&mut-file)。没有写入目标文件。@apemanzilla谢谢
io::copy
Indicatatif::ProgressBar
对我来说非常有效。这不是问题所问的“不使用循环中的stream.read()将数据读取到内存中?”
copy
使用缓冲区,@Stargateur如果要高效地复制数据,您需要将数据缓冲到某个地方,而且它不会比标准库已经提供的更容易或更快。内存中有数据到底有什么问题?我没有,但实际上你的答案是错误的,它没有回答OP问题。我不是ssh2方面的专家,但我只知道如果答案是真的,“不,你不能”是完全可以接受的。复制可能是一种方法,但需要一个缓冲区数据。@apemanzilla代码挂起在
std::io::copy(&mut-stream,&mut-file)。没有写入目标文件。@apemanzilla谢谢
io::copy
indicatif::ProgressBar
非常适合我。我认为您不可能至少需要将数据复制一次到用户空间,因为ssh2是如何工作的,它可能必须对套接字中的数据进行一些转换,因此需要一个缓冲区来写入加密数据。@Stargateur我使用的是最新版本
v0.3.3
。问题并不是关于上述代码的问题,而是关于如何在Rust中执行某些操作。i、 e.如何在不使用循环的情况下将
stream:ssh2::stream
写入文件。我包含上述代码只是为了显示
变量的类型。@Stargateur谢谢。我在按照您的建议创建最小可复制示例时修复了错误:)
io::copy
必须使用
remote\u file
ssh2::Channel
)调用,而不是
remote\u file.stream()
ssh2::stream
)。您能找到问题的解决方案真是太好了!你应该把它作为一个答案而不是对你的问题进行编辑,然后潜在地接受这个答案。这样,问题就会在搜索结果中显示为已解决,人们可以对你的答案进行投票,你的解决方案会对未来有相同问题的人更有帮助。我认为你不可能至少需要将数据复制一次到用户空间,因为ssh2是如何工作的,它可能必须对套接字中的数据进行一些转换,因此需要一个缓冲区来写入加密数据。@Stargateur我使用的是最新版本
v0.3.3
。问题并不是关于上述代码的问题,而是关于如何在Rust中执行某些操作。i、 e.如何在不使用循环的情况下将
stream:ssh2::stream
写入文件。我包含上述代码只是为了显示
变量的类型。@Stargateur谢谢。我在按照您的建议创建最小可复制示例时修复了错误:)
io::copy
必须使用
remote\u file
ssh2::Channel
)调用,而不是
remote\u file.stream()
ssh2::stream
)。您能找到问题的解决方案真是太好了!你应该把它作为一个答案而不是对你的问题进行编辑,然后潜在地接受这个答案。这样,问题就会在搜索结果中显示为已解决