如何从 OsStr 和 str 组件构建 URL?

2024-04-18

此代码遍历文件夹,并查找以以下结尾的文件.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
};

您可以使用to_str https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.to_str中的方法OsStr得到一个Option<&str>。它返回一个Option因为如果字符串不包含有效的 Unicode,转换可能会失败。如果您绝对确定它始终是有效的 Unicode,您可以unwrap the Option。因此,您可以按如下方式创建您的 url:

let url = format!("{}{}", BASE_URL, name.to_str().unwrap());

Edit 1

{:?}用于调试打印。它使用Debug https://doc.rust-lang.org/std/fmt/trait.Debug.html特征。正如链接所说,调试

应该在面向程序员的调试上下文中格式化输出

碰巧在您的情况下,这恰好是您想要的字符串,但这不是它的预期行为。我仍然推荐使用该方法to_str已为您的用例明确提供

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 OsStr 和 str 组件构建 URL? 的相关文章

随机推荐

  • 获取.NET程序集的日期[重复]

    这个问题在这里已经有答案了 如何从当前 NET 程序集中检索创建日期 我想添加一些非常简单的功能 让我的应用程序在主程序集构建日期一周后停止工作 我已经编写了在给定日期后杀死我的应用程序的代码 我只需要以编程方式从程序集中检索创建日期 以下
  • 分析 mex 函数

    我刚刚用 c 将 Matlab 程序重写为 mex 函数以加快速度 并取得了出色的结果 这个优化决策是一个非常非常好的主意 无需线程即可将速度提高 20 倍 它仍然让我很好奇 mex 函数将时间花在什么上 并希望找出可能的瓶颈 我正在寻找一
  • 创建自定义表格表示的函数

    我使用下面的代码来概述我的部分数据 从以下代码中创建函数的最佳方法是什么 它将采用 dataList 以及一些图形选项 例如颜色 作为参数 并返回自定义的表格表示形式 如下所示 overviewtheData Text Grid Map R
  • Symfony 2 FOS 用户捆绑包 Bootstrap 模式 AJAX 登录

    有没有人已经使用 Symfony 2 和 FOS User Bundle 在 Bootstrap 模式中构建了登录表单 这是我现在所拥有的 src Webibli UserBundle Resources config service ym
  • 使用 PHP 生成 Windows .lnk 文件

    我正在开发一个项目 其中涉及运行 ProFTPd 的 FTP 服务器和为用户创建帐户的 PHP MySQL 后端 创建帐户后 系统会向用户发送电子邮件 其中包含其帐户详细信息以及下载 FileZilla 或 Cyber Duck 的说明 具
  • Publish 不是改造 web.config 吗?

    我制造了一个web config 完整文件 http pastebin com rYreaVyP 它不显示 XML 错误
  • 如何从 HttpInputStream 获取 docx 文件的字节数组?

    我正在使用这篇文章第一个答案中的方法 如何从 HttpPostedFile 创建字节数组 https stackoverflow com questions 359894 how to create byte array from http
  • 如何写入 stdIn (JAVA) [重复]

    这个问题在这里已经有答案了 我想通过使用一些输入 例如 join 8 对我的 P2P 系统进行一些测试 8 是节点号 对于我的系统 命令 join 8 是从标准输入读取的 但我不想将其键入数百次以进行数百次测试 因此我编写了一个测试函数来随
  • HTML5 视频 - 在特定时间开始视频并播放 x 时间

    我正在尝试创建在特定时间点启动本地视频并播放特定持续时间的按钮 我已经让它在某个时刻播放 但不知道如何让它只播放一定的持续时间 这是代码 HTML
  • C++ 中的叉积

    给定以下Python 来自http norvig com sudoku html http norvig com sudoku html def cross A B Cross product of elements in A and el
  • 使用 Terraform(工作区、模块?)配置客户帐户最佳实践?

    我需要在 AWS 中创建和管理多个客户环境 并且希望利用 Terraform 来部署所有必要的资源 每个客户环境基本相同 只是用于访问其中一台服务器的 URL 不同 我已经整理了一个 Terraform 配置 可以为给定客户部署所有资源 但
  • 来自本地运行的 docker 容器内的 Azure 托管身份

    我正在运行一个由 asp net core 2 2 api 组成的 docker 容器 此 api 需要访问 Azure 密钥保管库 并且我已使用在密钥保管库上具有正确访问策略的用户登录 Visual Studio 以检索机密 但是 当我使
  • 为什么 JDBC 是动态加载而不是导入? [复制]

    这个问题在这里已经有答案了 在 JDBC 中 我只看到使用的示例 Class forName com mysql jdbc Driver true cl 还没有看到有人使用 import com mysql jdbc Driver 是不是因
  • 从 MySQL 数据库中选择随机问题; “正确答案”搞砸了

    我正在使用 PHP 和 MYSQL 构建一个简单的测验程序 测验旨在一次显示一个问题 问题为多项选择题 每个问题有 4 个可能的答案 如果玩家选择正确 他将进入下一个问题 如果他选错了 测验就会结束 首先 我设计的测验如下 1 创建一个数据
  • 如何使用 Spring 表达式语言将不带构造函数的对象添加到列表中

    我想添加一个BigDecimal使用 Spring 表达式语言的列表 public class SpelTest public List
  • 检查 iterable 的所有值是否为零

    有没有一种好的 简洁 内置的方法来查看可迭代中的所有值是否为零 现在我正在使用all 有一点列表理解 但是 对我来说 似乎应该有一种更具表现力的方法 我认为这在某种程度上相当于memcmp in C values 0 0 0 0 0 Tes
  • 使用 bash、Azure CLI 和 REST API 访问 CosmosDB - 如何正确获取令牌和哈希?

    我的最终目标是使用 bash 和 Azure CLI 将文档上传到现有的 CosmosDB SQL 实例 问题是 Azure CLI 确实如此不提供修改文档的命令 https learn microsoft com en us cli az
  • Spring MVC application.properties 不会被配置文件 application-dev.properties 覆盖

    我正在寻找一种根据 JVM 环境变量配置不同 application properties 文件的方法 我在 Spring 参考资料中找到了这个文档 除了 application properties 文件之外 还可以使用命名约定 appl
  • C# 中的异常有多昂贵?

    C 中的异常有多昂贵 只要堆栈不深 它们似乎并不会非常昂贵 然而我读到了相互矛盾的报道 有没有没有被反驳的明确报告 读到异常在性能方面代价高昂后 我编写了一个简单的测量程序 与该程序非常相似乔恩 斯基特 多年前发表 https web ar
  • 如何从 OsStr 和 str 组件构建 URL?

    此代码遍历文件夹 并查找以以下结尾的文件 txt 接下来 我想采取entry file name 这是属于std ffi os str OsStr输入 并将其加入BASE URL来形成一个 URL const FOLDER NAME str