使用 ftp crate 时未解析的名称 `Binary`
Unresolved name `Binary` when using the ftp crate
我正在使用 FTP 服务器从 FTP 下载文件
the ftp crate:
extern crate ftp;
extern crate chrono;
use std::env;
use std::fs::File;
use std::str;
use std::io::{Result, Write};
use ftp::FtpStream;
use chrono::*;
fn main() {
let args: Vec<String> = env::args().collect();
ftpgp(&args[1], &args[2], &args[3], &args[4]).unwrap_or_else(|err|
panic!("{}", err)
);
}
fn ftpgp(addr: &str, user: &str, pass: &str, remote_path: &str,) -> Result<()> {
let dt = Local::now();
let now = dt.format("%Y-%m-%d %H:%M:%S").to_string();
let mut ftp_stream = try!(FtpStream::connect((addr, 21)));
try!(ftp_stream.login(user, pass));
ftp_stream.cwd(remote_path).unwrap();
let file_list = try!(ftp_stream.nlst(None));
let files: Vec<String> = file_list.into_iter()
.filter(|name| name.ends_with(".zip"))
.collect();
for file in files {
try!(ftp_stream.retr(file.as_str(), |stream| {
let mut file = File::create(file.clone()).unwrap();
let mut buf = [0; 2048];
loop {
match stream.read(&mut buf) {
Ok(0) => break,
Ok(n) => file.write_all(&buf[0..n]).unwrap(),
Err(err) => return Err(err)
};
}
Ok(())
}));
println!("{} Saving: {}", now, file);
ftp_stream.rm(file.as_str()).unwrap();
println!("{} Delete from ftp: {}", now, file);
}
ftp_stream.quit()
}
但 zip 文件在下载后已损坏:
unzip -t sample.zip
Archive: sample.zip
warning [sample.zip]: 252314 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 252314
(attempting to re-compensate)
testing: sample.pdf
error: invalid compressed data to inflate
file #2: bad zipfile offset (local header sig): 67841095
(attempting to re-compensate)
file #2: bad zipfile offset (local header sig): 67841095
file #3: bad zipfile offset (local header sig): 68093906
我有set the type of file to be transferred,但我不知道如何。
像这样:
ftp_stream.transfer_type(Binary);
不工作。
error: unresolved name `Binary`
这只是一个名称解析问题。
您已声明对外部 crate 的依赖:
extern crate ftp;
然后从这个板条箱导入一个符号:
use ftp::FtpStream;
因此,符号 ::ftp::types::FileType::Binary
不在范围内。
您可以使用全名,也可以修改您的导入:
use ftp::{FtpStream, types}
表示可以写成types::FileType::Binary
use ftp::types::FileType
表示可以写成FileType::Binary
use ftp::types::FileType::Binary
表示可以写成Binary
这真的是一个品味问题。
另请注意,如果您愿意,可以将 use
语句放在唯一使用 Binary
的函数中以收紧导入范围;我想让它更清楚地说明导入的使用位置(以及不使用导入的位置)。
我正在使用 FTP 服务器从 FTP 下载文件 the ftp crate:
extern crate ftp;
extern crate chrono;
use std::env;
use std::fs::File;
use std::str;
use std::io::{Result, Write};
use ftp::FtpStream;
use chrono::*;
fn main() {
let args: Vec<String> = env::args().collect();
ftpgp(&args[1], &args[2], &args[3], &args[4]).unwrap_or_else(|err|
panic!("{}", err)
);
}
fn ftpgp(addr: &str, user: &str, pass: &str, remote_path: &str,) -> Result<()> {
let dt = Local::now();
let now = dt.format("%Y-%m-%d %H:%M:%S").to_string();
let mut ftp_stream = try!(FtpStream::connect((addr, 21)));
try!(ftp_stream.login(user, pass));
ftp_stream.cwd(remote_path).unwrap();
let file_list = try!(ftp_stream.nlst(None));
let files: Vec<String> = file_list.into_iter()
.filter(|name| name.ends_with(".zip"))
.collect();
for file in files {
try!(ftp_stream.retr(file.as_str(), |stream| {
let mut file = File::create(file.clone()).unwrap();
let mut buf = [0; 2048];
loop {
match stream.read(&mut buf) {
Ok(0) => break,
Ok(n) => file.write_all(&buf[0..n]).unwrap(),
Err(err) => return Err(err)
};
}
Ok(())
}));
println!("{} Saving: {}", now, file);
ftp_stream.rm(file.as_str()).unwrap();
println!("{} Delete from ftp: {}", now, file);
}
ftp_stream.quit()
}
但 zip 文件在下载后已损坏:
unzip -t sample.zip
Archive: sample.zip
warning [sample.zip]: 252314 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 252314
(attempting to re-compensate)
testing: sample.pdf
error: invalid compressed data to inflate
file #2: bad zipfile offset (local header sig): 67841095
(attempting to re-compensate)
file #2: bad zipfile offset (local header sig): 67841095
file #3: bad zipfile offset (local header sig): 68093906
我有set the type of file to be transferred,但我不知道如何。
像这样:
ftp_stream.transfer_type(Binary);
不工作。
error: unresolved name `Binary`
这只是一个名称解析问题。
您已声明对外部 crate 的依赖:
extern crate ftp;
然后从这个板条箱导入一个符号:
use ftp::FtpStream;
因此,符号 ::ftp::types::FileType::Binary
不在范围内。
您可以使用全名,也可以修改您的导入:
use ftp::{FtpStream, types}
表示可以写成types::FileType::Binary
use ftp::types::FileType
表示可以写成FileType::Binary
use ftp::types::FileType::Binary
表示可以写成Binary
这真的是一个品味问题。
另请注意,如果您愿意,可以将 use
语句放在唯一使用 Binary
的函数中以收紧导入范围;我想让它更清楚地说明导入的使用位置(以及不使用导入的位置)。