此代码遍历文件夹,并查找以以下结尾的文件.txt
。接下来,我想采取entry.file_name()
这是属于std::ffi::os_str::OsStr
输入,并将其加入BASE_URL
来形成一个 URL。
const FOLDER_NAME: &str = "/tmp";
const PATTERN: &str = ".txt";
const BASE_URL: &str = "http://192.168.1.100:3310/";
use std::error::Error;
use std::ffi::OsStr;
use walkdir::WalkDir;
fn main() -> Result<(), Box<dyn Error>> {
println!("Walking folder {}", FOLDER_NAME);
let valid_entries = WalkDir::new(FOLDER_NAME)
.into_iter()
.flat_map(|e| e)
.flat_map(|e| {
let name = e.file_name().to_str()?;
if name.contains(PATTERN) {
Some(e)
} else {
None
}
});
print_type_of(&valid_entries);
for entry in valid_entries {
println!("This file matches: {:?}", entry);
let metadata = entry.metadata()?;
let size = metadata.len();
let name = entry.file_name();
let fullpath = entry.path().display();
println!("path: {}, filename: {:?}, Len: {:?}", fullpath, name, size);
print_type_of(&name);
//let url = format!("{}{}",BASE_URL, name); <--- this, how do I do this?
}
Ok(())
}
fn print_type_of<T>(_: &T) {
println!("{}", std::any::type_name::<T>())
}
放大的示例输出:
error[E0277]: `std::ffi::OsStr` doesn't implement `std::fmt::Display`
--> src/main.rs:34:38
|
34 | let url = format!("{}{}",BASE_URL, name);
| ^^^^ `std::ffi::OsStr` cannot be formatted with the default formatter
|
= help: the trait `std::fmt::Display` is not implemented for `std::ffi::OsStr`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
= note: required because of the requirements on the impl of `std::fmt::Display` for `&std::ffi::OsStr`
= note: required by `std::fmt::Display::fmt`
在 Go 中,我这样做:
video_url := baseURL + *video.Name
req, err := http.NewRequest("HEAD", video_url, nil)
if err != nil {
log.Println("Err", err)
}
在 Rust 中执行此操作的正确方法是什么?
我得到的最接近的是:
let url = format!("{}{:?}", BASE_URL, name);
println!("url {}", url);
这使:
This file matches: DirEntry("/tmp/a.txt")
path: /tmp/a.txt, filename: "a.txt", Len: 820805
&std::ffi::os_str::OsStr
&str
url http://192.168.1.100:3310/"a.txt" <- malformed
This file matches: DirEntry("/tmp/somefile.txt")
path: /tmp/somefile.txt, filename: "somefile.txt", Len: 13
&std::ffi::os_str::OsStr
&str
url http://192.168.1.100:3310/"somefile.txt" <- malformed
有了这个我必须弄清楚如何删除"
s。当然感觉还有更好的方法,我不知道..
由于正确的方法使用match
表达式,如何构建 URL?
let name = entry.file_name();
let name_to_str = entry.file_name().to_str();
let url = match name_to_str {
Some(name) => format!("{}{:?}",BASE_URL, name_to_str).replace("\"", ""),
_ => None
};