首页 > 编程语言 >如何在Rust程序项目中安全地使用外部或是项目目录下的文件?

如何在Rust程序项目中安全地使用外部或是项目目录下的文件?

时间:2024-04-16 10:12:54浏览次数:26  
标签:项目 路径 绝对路径 回传 相对路径 println path 目录 Rust

在开发程序的时候难免会需要在程序中引入外部的文件,为了方便管理我们也常会将这些文件放置在程序项目目录下。然而在代码撰写程序路径于运行阶段读取文件时,文件路径的正确性需要等到运行阶段的时候才会知道,就算写错了而找不到这个文件,程序项目也是能成功通过编译,这就会使得程序在运行阶段有出现问题的可能。

Rust内置的includeinclude_strinclude_bytes宏会在编译阶段去检查文件是否存在,这是因为在编译阶段的时候就要把文件引用进来。但有时候我们会希望文件是在程序运行阶段才引入,所以就要有个机制是让Rust能够在编译项目的时候,去检查文件路径是否存在。

Manifest Dir Macros

「Manifest Dir Macros」是笔者开发的套件,提供了一些类似函数的宏,能够在编译阶段检查或是操作相对于CARGO_MANIFEST_DIR的文件路径。CARGO_MANIFEST_DIR就是Cargo程序项目的Cargo.toml的所在目录,也就是程序项目的根目录啦!

Crates.io

https://crates.io/crates/manifest-dir-macros

Cargo.toml

manifest-dir-macros = "0.1.18"

使用方法

manifest_dir_macros这个crate提供了以下几个宏:

  • absolute_path:只允许传入的路径为绝对路径。回传绝对路径。
  • directory_absolute_path:只允许传入的路径为绝对路径,且是个目录(必须存在)。回传绝对路径。
  • directory_path:允许传入的路径可为绝对路径或相对路径。如果是相对路径,会使其相对于CARGO_MANIFEST_DIR。且是个目录(必须存在)。回传绝对路径。
  • directory_relative_path:只允许传入的路径为相对路径,会使其相对于CARGO_MANIFEST_DIR,且是个目录(必须存在)。回传绝对路径。
  • exist_absolute_path:只允许传入的路径为绝对路径,且必须存在。回传绝对路径。
  • exist_path:允许传入的路径可为绝对路径或相对路径。如果是相对路径,会使其相对于CARGO_MANIFEST_DIR。且必须存在。回传绝对路径。
  • exist_relative_path:只允许传入的路径为相对路径,会使其相对于CARGO_MANIFEST_DIR,且必须存在。回传绝对路径。
  • file_absolute_path:只允许传入的路径为绝对路径,且是个文件(必须存在)。回传绝对路径。
  • file_path:允许传入的路径可为绝对路径或相对路径。如果是相对路径,会使其相对于CARGO_MANIFEST_DIR。且是个文件(必须存在)。回传绝对路径。
  • file_relative_path:只允许传入的路径为相对路径,会使其相对于CARGO_MANIFEST_DIR,且是个文件(必须存在)。回传绝对路径。
  • get_extension:回传传入的路径的扩展名。如果没有指定默认值,路径中的扩展名不存在的话会编译失败。
  • get_file_name:回传传入的路径的文件名称。如果没有指定默认值,路径中的文件名称不存在的话会编译失败。
  • get_file_stem:回传传入的路径的不包含扩展名的文件名称(主文件名)。如果没有指定默认值,路径中的主文件名不存在的话会编译失败。
  • get_parent:回传传入的路径的上一层文件路径。如果没有指定默认值,路径已经是最上一层的话会编译失败。
  • mime_guess:须激活mime_guess特色才能使用。借由文件路径(或者准确的说,路径中的扩展名),来猜测并回传文件的MIME Type,如果没有指定默认值,且无法猜到文件的MIME Type的话会编译失败。
  • not_directory_absolute_path:只允许传入的路径为绝对路径,且不是个目录(必须存在)。回传绝对路径。
  • not_directory_path:允许传入的路径可为绝对路径或相对路径。如果是相对路径,会使其相对于CARGO_MANIFEST_DIR。且不是个目录(必须存在)。回传绝对路径。
  • not_directory_relative_path:只允许传入的路径为相对路径,会使其相对于CARGO_MANIFEST_DIR,且不是个目录(必须存在)。回传绝对路径。
  • path:允许传入的路径可为绝对路径或相对路径。如果是相对路径,会使其相对于CARGO_MANIFEST_DIR。回传绝对路径。
  • relative_path:只允许传入的路径为相对路径,会使其相对于CARGO_MANIFEST_DIR。回传绝对路径。

传给宏的文件路径可以是一个字符串定数,也可以是多个用逗号隔开的文件名(字符串定数),宏会根据编译环境的操作系统将这些文件名其加上适当的斜线或反斜线,串接在一起成一个路径。

如果有激活tuple特色,还可以用嵌套的「元组(tuple)」,来串接多个文件名(字符串定数),这个用法可以与macro_rule宏搭配使用。

范例代码如下:

#[macro_use] 
extern crate manifest_dir_macros;
 
println!(path!("Cargo.toml"));
println!(path!("src/lib.rs"));
println!(path!("src", "lib.rs"));
println!(path!("src", "lib.rs", "/bin"));
println!(path!("/usr"));
 
println!(exist_path!("Cargo.toml"));
println!(directory_path!("src"));
println!(not_directory_path!("Cargo.toml"));
println!(file_path!("Cargo.toml"));
 
println!(relative_path!("Cargo.toml"));
println!(directory_relative_path!("src"));
println!(not_directory_relative_path!("Cargo.toml"));
println!(file_relative_path!("Cargo.toml"));
 
println!(get_file_name!("src/lib.rs"));
println!(get_file_name!(default = "main.rs", "/"));
println!(get_file_stem!("src/lib.rs"));
println!(get_file_stem!(default = "lib", "/"));
println!(get_extension!("src/lib.rs"));
println!(get_extension!(default = "rs", "src/lib"));
println!(get_parent!("src/lib.rs"));
println!(get_parent!(default = "/home", "/"));
 
// enable the `mime_guess` feature
{
    println!(mime_guess!("src/lib.rs"));
    println!(mime_guess!(default = "application/octet-stream", "Cargo.lock"));
}
 
// The `tuple` feature lets these macros above support to input nested literal string tuples, which is useful when you want to use these macros inside a `macro_rule!` macro and concatenate with other literal strings.
// `$x:expr` matchers can be used in these macros thus.
{
    println!(path!(("foo",)));
    println!(path!(("foo", "bar")));
    println!(path!("a", ("foo", "bar")));
    println!(path!(("foo", "bar"), "a"));
    println!(path!(("foo", "bar"), ("a", "b")));
    println!(path!(("foo", "bar", ("a", "b")), ("c", "d")));
}

标签:项目,路径,绝对路径,回传,相对路径,println,path,目录,Rust
From: https://www.cnblogs.com/RioTian/p/18137528

相关文章

  • vue项目中展示markdown文件(markdown-it-vue)
    //安装依赖npmimarkdown-it-vue//引入markdown-ite-vueimportMarkdownItVuefrom"markdown-it-vue";import"markdown-it-vue/dist/markdown-it-vue.css";//注册组件components:{MarkdownItVue},//使用组件<markdown-it-vueclass="......
  • 记录解决VS 2022调试C++ DLL项目时卡顿的问题
    项目结构运行时为DotNet6的C#通过Cli/C++去调用C++的DLL。问题表现在VisualStudio2022中调试C++DLL代码时,按下F5、F10、F11跳转到下一行时VS卡顿会2秒左右,体验非常不好。问题原因然后发现原因是项目的配置属性中,调试那一行,调试器类型选择的是“自动”。解决此问题的方法......
  • Visual Studio 工具箱报错:未能加载工具箱项,将从项目中移除(转)
    未能加载工具箱项1篇文章0订阅订阅专栏我是在使用AnyCpu模式下,出现上面的错误,因为我目标平台设置的是X64解决办法:只需要把【项目名称右键->属性->生成->目标平台】设置成AnyCpu,一开始我设置的X64,因为有些第三方Nuget包不允许在X86下运行,所以为了使程序在X64下运行,把目标平台......
  • vue2项目 network无法访问此网站
    vue2项目启动后,local可以访问,但是network不能访问防火墙等等都检查了查到原因如下:本来写的是这样,实际上端口号需要保持一致devServer:{disableHostCheck:true,open:true,host:'0.0.0.0',port:8002,https:false,hotOnly:false,public......
  • 案例二十一备份30天之前的日志并压缩到指定目录下
    #!/bin/bash#备份目录info_backdir=/backup/log/info/`date-d"30dayago"+%F|awk-F"-"'{print$1"-"$2}'`error_backdir=/backup/log/error/`date-d"30dayago"+%F|awk-F"-"'{print$1"......
  • 使用OpenCV来实现读取一个目录下的所有图像,然后将它们调整大小为1920x1080像素,并保存
    使用OpenCV来实现读取一个目录下的所有图像,然后将它们调整大小为1920x1080像素,并保存的步骤如下:安装OpenCV库:如果你还没有安装OpenCV库,可以通过pip安装:pipinstallopencv-python编写Python脚本:importosimportcv2defresize_images_in_directory(source_dir,target......
  • 实际项目中一般使用到的git知识
    1.项目上线分支管理流程图片压缩太厉害有些模糊700k压缩到20多k清晰些的图片地址https://project.zdzspace.cn/test-vuekey2.一些常用的git命令gitfetch拉取远程仓库最新代码但是不合并到本地分支gitmergefeature-a用于合并本地分支feature-a到当前分支常用gti......
  • 项目整合管理
             ......
  • 十款优质企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目,减少开发工作!)
     Java微服务开源项目前言一、pig二、zheng三、SpringBlade四、SOP五、matecloud六、mall七、jeecg-boot八、Cloud-Platform九、microservices-platform十、RuoYi-Cloud 前言这篇文章为大家推荐几款优质的Java开源项目框架,可以用于学习,毕业设计,公司项目......
  • Rust 04
    ///https://kaisery.github.io/trpl-zh-cn/ch03-05-control-flow.html///控制流fnmain(){println!("Hello,world!");letnumber=3;println!("Firstnumberis{number}");letnumber=7;ifnumber<5{println!(......