0

0

C#文件系统快照 C#如何利用卷影复制服务(VSS)创建文件快照

星降

星降

发布时间:2026-03-02 10:49:02

|

349人浏览过

|

来源于php中文网

原创

vss快照是windows卷级一致性只读副本,可绕过文件锁读取占用中文件;普通复制遇独占锁即失败。它非备份工具,需手动管理生命周期,且c#调用依赖com互操作或vsssharp库。

c#文件系统快照 c#如何利用卷影复制服务(vss)创建文件快照

什么是 VSS 快照,它和普通文件复制有啥区别

VSS(Volume Shadow Copy Service)是 Windows 内置的卷级快照机制,能在文件被占用(如数据库、日志、打开的 Word 文档)时,生成一致性的只读副本。普通 File.CopyDirectory.GetFiles 在文件被独占锁住时会直接抛出 IOExceptionUnauthorizedAccessException,而 VSS 能绕过锁,拿到那一刻的磁盘块级一致性视图。

注意:VSS 不是“备份工具”,它不跨卷、不压缩、不加密,也不自动清理——快照生命周期需手动管理,否则会撑爆系统卷影存储空间。

C# 调用 VSS 的两种可行路径

.NET 没有原生 VSS API 封装,必须通过 COM 互操作调用 Windows 原生接口。主流做法只有两个:

  • 使用微软官方提供的托管包装器 VSSSharp(已归档但可用,需 NuGet 安装 Microsoft.VSSSharp
  • 直接 P/Invoke 或 COM Interop 调用 IVssBackupComponents 等接口(更底层,控制力强但易出错)

推荐初学者用 VSSSharp,它封装了初始化、添加卷、准备快照、获取路径等关键步骤。但要注意:该库仅支持 .NET Framework(net461 及以上),在 .NET Core / .NET 5+ 中需启用 COM 支持并手动注册类型库(vssadmin.exe 不可替代)。

创建快照的关键步骤与常见报错

使用 VSSSharp 创建一个 D: 卷快照的最小可行流程如下:

Seede AI
Seede AI

AI 驱动的设计工具

下载
  • 初始化 VssBackupComponents 实例
  • 调用 InitializeForBackup(必须以管理员权限运行,否则报 E_ACCESSDENIED
  • 调用 AddToSnapshotSet 加入目标卷(如 "D:\",注意结尾反斜杠)
  • 调用 PrepareForBackupDoSnapshotSet
  • 从返回的 SnapshotSet 中提取 SnapshotDeviceObject(即快照挂载路径,形如 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy123

常见卡点:

  • 0x80042302 (VSS_E_OBJECT_NOT_FOUND):卷不支持 VSS(如 FAT32、网络驱动器、BitLocker 加密卷未解锁)
  • 0x8004231f (VSS_E_SNAPSHOT_SET_IN_PROGRESS):已有快照正在创建,需等待或清理残留
  • 0x80042308 (VSS_E_MAXIMUM_NUMBER_OF_SNAPSHOTS_REACHED):默认单卷最多 64 个快照,用 vssadmin list shadows 查看,vssadmin delete shadows /for=D: /all 清理

如何安全访问快照中的文件

快照路径(如 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy123)不能直接传给 File.ReadAllText,.NET 的 IO 类默认拒绝这类设备路径。必须:

  • 使用 \?\ 前缀 + 完整设备路径构造 FileStream(需指定 FileOptions.None,禁用缓存)
  • 或将快照映射为临时驱动器号(不推荐,需调用 MountVol,权限复杂且易冲突)
  • 更稳妥的做法:用 Directory.EnumerateFiles 配合 \?\ 路径前缀遍历,再逐个用 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read) 打开

注意:FileInfo.Length 在快照路径下可能返回 0 或异常,应改用 FileStream.Length;所有快照句柄应在使用后立即释放,否则快照无法自动卸载,占用存储空间。

VSS 快照不是“复制即走”的轻量操作,它的生命周期、权限模型、路径兼容性都和常规文件操作完全不同。哪怕只是读取一个被锁定的 Excel 文件,也得先确认卷是否支持、是否有足够影子存储、是否以管理员身份启动进程——漏掉任意一环,DoSnapshotSet 就会静默失败或卡死。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1730

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

549

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

43

2026.01.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

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

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

287

2023.11.13

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

45

2026.02.28

热门下载

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

精品课程

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

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.1万人学习

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

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