使用DiscUtils库打开VDI/VDH镜像文件报错求助
解决DiscUtils打开VDI/VHD文件的问题
第一段代码的问题
你用CDReader读取VDI文件是错误的——CDReader专门用于处理光盘镜像(比如ISO文件),而VDI是虚拟机磁盘镜像,属于块设备类型,两者完全不匹配,因此这段代码根本无法识别VDI的内容结构。
第二段代码的错误原因
创建DiscUtils.Vdi.Disk时出现的类型转换错误,是因为你传入了List<DiskImageFile>,但该类的构造函数并没有接收这个类型的重载参数。正确的做法是通过DiskImageFile自带的OpenDisk()方法获取虚拟磁盘实例,而非直接实例化DiscUtils.Vdi.Disk。
修正后的代码示例
using System; using System.IO; using DiscUtils; using DiscUtils.Vdi; using DiscUtils.FileSystems; class Program { static void Main(string[] args) { string vdiPath = @"D:\123.vdi"; using (var vdiStream = File.OpenRead(vdiPath)) using (var diskImage = new DiskImageFile(vdiStream)) using (var virtualDisk = diskImage.OpenDisk()) { var volumeManager = new VolumeManager(virtualDisk); var logicalVolumes = volumeManager.GetLogicalVolumes(); foreach (var volume in logicalVolumes) { var fsInfos = FileSystemManager.DetectFileSystems(volume); foreach (var fsInfo in fsInfos) { using var fileSystem = fsInfo.Open(volume); TraverseFileSystem(fileSystem, fileSystem.Root); } } } } static void TraverseFileSystem(IFileSystem fs, DirectoryInfo dir) { Console.WriteLine($"目录: {dir.FullName}"); foreach (var file in dir.GetFiles()) { Console.WriteLine($"文件: {file.FullName}"); } foreach (var subDir in dir.GetDirectories()) { TraverseFileSystem(fs, subDir); } } }
关键修正说明
- 替换了错误的
DiscUtils.Vdi.Disk实例化逻辑,改用diskImage.OpenDisk()获取标准的VirtualDisk对象,这是DiscUtils处理磁盘镜像的规范流程。 - 新增
TraverseFileSystem递归方法,能正确遍历文件系统的目录与文件,替代原代码中无意义的固定输出。 - 所有资源都通过
using语句管理,确保使用后自动释放,避免资源泄漏。
额外注意事项
- 需安装对应NuGet包:
DiscUtils.Core、DiscUtils.Vdi,如果要读取Linux的Ext文件系统(比如你的Kali镜像),还需安装DiscUtils.Ext。 - 运行程序时要保证对VDI文件有读取权限,否则会抛出权限异常。
- 动态扩展类型的VDI文件无需额外配置,DiscUtils会自动识别并读取。
内容的提问来源于stack exchange,提问作者waldez george
相关产品推荐
相关产品推荐

