0

0

C# 文件系统软删除 C#如何实现一个回收站功能而不是立即删除文件

月夜之吻

月夜之吻

发布时间:2026-03-11 14:17:03

|

112人浏览过

|

来源于php中文网

原创

软删除本质是移动而非擦除:windows回收站将文件移至$recycle.bin并记录元数据;c#无内置回收站api,需用shfileoperation或shell32.shell实现,跨平台则需自建带元数据的隐藏回收站目录。

c# 文件系统软删除 c#如何实现一个回收站功能而不是立即删除文件

软删除的本质是移动而非擦除

Windows 回收站不是魔法,它只是把文件移到特定系统目录($Recycle.Bin)并记录元数据。C# 没有内置“扔进回收站”函数,System.IO.File.Delete 仍是硬删——必须自己模拟移动逻辑。

关键判断:是否在 NTFS 卷上?是否对当前用户有权限访问 $Recycle.Bin?否则 fallback 到自建回收站目录是唯一可靠路径。

  • SHFileOperation(Win32 API)可触发原生回收站行为,但仅限 Windows,且需 P/Invoke 和 STATSHELLFILEOP 权限检查
  • 跨平台方案只能走“重命名 + 移动到隐藏目录”路线,比如 .trash_recycled
  • 不要依赖 FileSystemWatcher 监控删除事件来补救——它捕获不到 Delete 调用本身,只响应结果变化

用 Shell32.dll 实现真回收站(仅 Windows)

Shell32.Shell 类能绕过权限陷阱,把文件丢进当前用户的 $Recycle.Bin 并保留原始路径信息。但它不抛异常,失败时静默失败——这是最常踩的坑。

实操要点:

  • 引用 COM 组件:添加对 Shell32 的引用(.NET Framework)或用 Microsoft.WindowsAPICodePack-Shell(.NET Core/5+)
  • 必须用 Folder.MoveHere 方法,传入带完整路径的 string,不能用 Uri 或相对路径
  • 检查返回值:如果 MoveHere 返回 null 或空集合,说明操作被拒绝(如目标在只读卷、U 盘、网络驱动器)
  • 示例:
    var shell = new Shell32.Shell();
    var desktop = shell.NameSpace(0); // 桌面
    desktop.MoveHere(@"C:\temp\test.txt", 4 | 16); // FOF_NOCONFIRMATION | FOF_SILENT

Fallback 方案:自己管回收站目录

Shell32 不可用或跨平台时,你得自己维护一个“回收站”。重点不是存文件,而是存上下文——否则用户恢复时不知道该放回哪。

Video Ocean
Video Ocean

人人皆导演,让视频创作变得轻松自如

下载

必须记录的信息:

  • 原始绝对路径(OriginalPath
  • 删除时间(DeletedAt
  • 唯一 ID(建议用 Guid,避免同名文件覆盖)
  • 可选:原始文件大小、哈希(用于去重或校验)

目录结构建议:

.recycle/
├── 2024-06-15_abc123/
│   ├── metadata.json
│   └── test.txt
└── 2024-06-15_def456/
    ├── metadata.json
    └── report.pdf
不要把所有文件扁平扔进一个文件夹——恢复时无法区分来源。

恢复文件时容易忽略的权限和路径问题

从回收站还原,不是简单 File.Move 回去。原始路径可能已不存在、父目录无写入权、甚至盘符已被拔掉。

安全做法:

  • 先用 Directory.Exists(Path.GetDirectoryName(originalPath)) 检查父目录是否存在
  • 若不存在,递归创建(Directory.CreateDirectory),但注意:不要盲目创建 C:\Program Files 这类受保护路径
  • File.GetAttributes 检查目标是否为只读/隐藏/系统文件,还原前清除 FileAttributes.ReadOnly
  • 若原始路径是符号链接或挂载点,File.Move 会失败——此时应复制内容再删源,而不是移动

复杂点在于:回收站本身也得清理。自动清空策略(如 30 天)必须用独立线程或定时任务跑,不能卡在 UI 线程里;而且清理前要确认文件没被其他进程锁住——IOException 是常态,得重试或跳过。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1476

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1169

2023.07.27

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号