#system-api #windows #remove-dir-all #shfileoperation #shfileoperationw #ifileoperation

win32-remove-dir-all

在 Windows 上使用 Windows Shell 和属性系统 API 替换 std::fs::remove_dir_all

1 个不稳定版本

0.1.0 2020 年 9 月 6 日

#718文件系统

MIT/Apache

47KB
705 行代码(不包括注释)

win32-remove-dir-all

在 Windows 上使用 Windows Shell 和属性系统 API 替换 std::fs::remove_dir_all

Latest Version Released API docs MIT/Apache-2.0 licensed Rustc Version 1.37+ Build Status

Rust 标准库中 remove_dir_all 的当前 Windows 实现,有一个关于始终删除目录的长期问题。Windows Shell 和 Windows 属性系统 API 都提供了通过 SHFileOperationWIFileOperation 分别以一致结果递归删除目录的方法,尽管在相关的 GitHub 问题中尚未确定与 UWP 应用兼容的稳定解决方案。

此 crate 提供了一个基于 SHFileOperationWIFileOperationremove_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-2.0许可证定义的,您有意提交以供包含在本作品中的任何贡献,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~0–390KB