1 个不稳定版本
0.1.0 | 2020 年 9 月 6 日 |
---|
#718 在 文件系统
47KB
705 行代码(不包括注释)
win32-remove-dir-all
在 Windows 上使用 Windows Shell 和属性系统 API 替换 std::fs::remove_dir_all
。
Rust 标准库中 remove_dir_all
的当前 Windows 实现,有一个关于始终删除目录的长期问题。Windows Shell 和 Windows 属性系统 API 都提供了通过 SHFileOperationW
和 IFileOperation
分别以一致结果递归删除目录的方法,尽管在相关的 GitHub 问题中尚未确定与 UWP 应用兼容的稳定解决方案。
此 crate 提供了一个基于 SHFileOperationW
和 IFileOperation
的 remove_dir_all
实现,前者在后者不受支持时用作后备(推荐使用 IFileOperation
而不是 SHFileOperationW
,但仅支持 Windows Vista 及以后的版本)。对于非 Windows 平台,标准库 remove_dir_all
函数以方便的方式重新导出。
由于缺乏 Shell 和属性系统 API 对 UWP 应用的支持,建议 UWP 应用开发者使用 remove_dir_all
crate,因为它提供了一个不依赖于 Shell 或属性系统 API 的替代实现。
用法
将此添加到您的 Cargo.toml
[dependencies]
win32-remove-dir-all = "0.1"
Rust 版本支持
最低支持的 Rust 版本是 1.37。这主要是由于依赖项使用的语言特性,可能在以后的版本中发生变化。
示例
本crate提供的remove_dir_all
函数可以用作std::fs::remove_dir_all
的替换,即使在面向多个平台的目标代码中;在非Windows目标上,将自动使用std::fs::remove_dir_all
。
use std::{error::Error, fs, path::Path};
use win32_remove_dir_all::remove_dir_all;
fn main() -> Result<(), Box<dyn Error>> {
// Create a directory with a couple files residing in it.
fs::create_dir("foo")?;
fs::OpenOptions::new().create(true).write(true).open("foo/bar")?;
fs::OpenOptions::new().create(true).write(true).open("foo/baz")?;
// Delete the directory and all its contents as you would with `std::fs::remove_dir_all`.
remove_dir_all("foo")?;
Ok(())
}
禁用属性系统(IFileOperation
)支持
IFileOperation
的支持被限制在property_system_api
crate功能之下,该功能默认启用。为了支持Windows Vista之前的版本,没有必要禁用此功能,因为如果IFileOperation
不可用,将使用SHFileOperationW
代替。如果需要,仍然可以禁用此功能,例如如果关注构建时间或大小,在这种情况下,无论Windows版本如何,都将始终使用SHFileOperationW
。
许可证
根据您的要求,许可协议可以是
- Apache License,版本2.0 (LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以供包含在本作品中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~0–390KB