You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:50:22