在C#开发中,操作VHD虚拟硬盘文件是常见的需求,但很多开发者默认会依赖Hyper-V相关组件,这会增加部署环境的限制。实际上可以通过系统原生能力实现不依赖Hyper-V的VHD挂载与修改操作。

VHD文件基础说明
VHD是微软推出的虚拟硬盘格式,本质上是一个封装了硬盘分区、文件系统等信息的二进制文件。系统层面提供了原生的VHD操作支持,不需要额外安装Hyper-V角色即可使用相关能力。
通过DiskPart挂载VHD
Windows系统自带的DiskPart命令行工具支持VHD的挂载操作,我们可以通过C#调用进程执行DiskPart命令来完成挂载,这种方式不需要依赖Hyper-V组件。
DiskPart挂载命令说明
首先需要准备DiskPart的脚本文件,脚本内容包含选择VHD文件、挂载、分配盘符的步骤,示例如下:
select vdisk file="D:test.vhd" attach vdisk assign letter=Z exit
C#调用DiskPart的实现
我们可以通过Process类启动DiskPart进程,传入上述脚本执行挂载操作,代码如下:
using System;
using System.Diagnostics;
using System.IO;
public class VhdMountHelper
{
/// <summary>
/// 挂载VHD文件到指定盘符
/// </summary>
/// <param name="vhdPath">VHD文件路径</param>
/// <param name="driveLetter">分配的盘符,如Z</param>
public static void MountVhd(string vhdPath, string driveLetter)
{
// 创建临时DiskPart脚本文件
string scriptPath = Path.Combine(Path.GetTempPath(), "mount_vhd.txt");
string scriptContent = $@"
select vdisk file=""{vhdPath}""
attach vdisk
assign letter={driveLetter}
exit
";
File.WriteAllText(scriptPath, scriptContent);
// 启动DiskPart执行脚本
Process process = new Process();
process.StartInfo.FileName = "diskpart.exe";
process.StartInfo.Arguments = $"/s "{scriptPath}"";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
// 清理临时脚本
File.Delete(scriptPath);
if (process.ExitCode != 0)
{
string error = process.StandardError.ReadToEnd();
throw new Exception($"挂载VHD失败,错误信息:{error}");
}
}
}
修改VHD内的文件
VHD挂载成功后会分配对应的盘符,此时可以像操作普通本地磁盘一样操作VHD内的文件,通过C#的文件流相关API即可完成读写修改。
读取VHD内文件示例
假设挂载后盘符为Z,读取Z盘下test.txt文件的内容:
using System;
using System.IO;
public class VhdFileOperator
{
public static string ReadVhdFile(string driveLetter, string filePath)
{
string fullPath = Path.Combine($"{driveLetter}:\", filePath);
if (!File.Exists(fullPath))
{
throw new FileNotFoundException($"文件不存在:{fullPath}");
}
return File.ReadAllText(fullPath);
}
}
写入VHD内文件示例
向VHD内写入新文件或修改已有文件:
using System;
using System.IO;
public class VhdFileOperator
{
public static void WriteVhdFile(string driveLetter, string filePath, string content)
{
string fullPath = Path.Combine($"{driveLetter}:\", filePath);
// 确保目录存在
string directory = Path.GetDirectoryName(fullPath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
File.WriteAllText(fullPath, content);
}
}
卸载VHD文件
操作完成后需要卸载VHD,避免文件占用,同样通过DiskPart命令实现,C#调用代码如下:
using System;
using System.Diagnostics;
using System.IO;
public class VhdMountHelper
{
/// <summary>
/// 卸载已挂载的VHD文件
/// </summary>
/// <param name="vhdPath">VHD文件路径</param>
public static void UnmountVhd(string vhdPath)
{
string scriptPath = Path.Combine(Path.GetTempPath(), "unmount_vhd.txt");
string scriptContent = $@"
select vdisk file=""{vhdPath}""
detach vdisk
exit
";
File.WriteAllText(scriptPath, scriptContent);
Process process = new Process();
process.StartInfo.FileName = "diskpart.exe";
process.StartInfo.Arguments = $"/s "{scriptPath}"";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.WaitForExit();
File.Delete(scriptPath);
if (process.ExitCode != 0)
{
string error = process.StandardError.ReadToEnd();
throw new Exception($"卸载VHD失败,错误信息:{error}");
}
}
}
注意事项
- 执行挂载和卸载操作需要管理员权限,C#程序需要以管理员身份运行,否则DiskPart会执行失败。
- 挂载前需要确认VHD文件没有被其他进程占用,否则会导致挂载失败。
- 修改VHD内文件时需要注意文件系统的权限,部分系统保护的目录可能无法直接写入。
- 操作完成后务必执行卸载操作,否则VHD文件会一直处于占用状态,无法正常移动或删除。
C#VHDvirtual_disk_mountDiskPart修改时间:2026-07-16 11:48:27