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

C# 如何识别文件夹中的DICOM文件(含无.dcm后缀场景)

DICOM文件识别实现方案

方案1:手动校验文件头字节

根据你已知的DICOM文件头规则,可直接读取文件前132字节做校验,性能较高,实现代码如下:

// 单个文件DICOM格式校验
private bool CheckDicomHeader(string filePath)
{
    FileInfo fileInfo = new FileInfo(filePath);
    // 文件长度不足132字节直接排除
    if (fileInfo.Length < 132)
        return false;

    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        byte[] headerBuffer = new byte[132];
        fs.Read(headerBuffer, 0, 132);

        // 校验前128字节是否全为空
        for (int i = 0; i < 128; i++)
        {
            if (headerBuffer[i] != 0)
                return false;
        }

        // 校验后续4字节是否为DICM标识
        return headerBuffer[128] == 'D' 
            && headerBuffer[129] == 'I' 
            && headerBuffer[130] == 'C' 
            && headerBuffer[131] == 'M';
    }
}

遍历文件夹所有文件调用示例:

// 读取文件夹下所有文件,不限制后缀
string[] allFiles = Directory.GetFiles("你的文件夹路径", "*", SearchOption.TopDirectoryOnly);
List<string> validDicomFiles = allFiles.Where(CheckDicomHeader).ToList();

注意:该方法仅适用于业务场景下所有DICOM都符合「前128字节为空」规则的情况,部分合规DICOM允许在前128字节存储自定义内容,会被该方法误判为无效。

方案2:使用fo-dicom自带校验(更推荐)

fo-dicom已经封装了兼容所有标准DICOM格式的校验逻辑,不需要自行处理字节边界问题,调用内置方法即可,兼容性更强:

using FellowOakDicom;

private bool CheckDicomByFoDicom(string filePath)
{
    try
    {
        // 仅校验DICOM头,性能较高
        return DicomFile.HasValidHeader(filePath);
    }
    catch
    {
        // 捕获文件占用、无权限等异常,统一判定为非有效DICOM
        return false;
    }
}

如果需要确保DICOM文件可完整解析、没有内部损坏,可以改用全量校验逻辑:

private bool CheckCompleteDicom(string filePath)
{
    try
    {
        // 跳过大标签读取,兼顾性能和完整性校验
        _ = DicomFile.Open(filePath, FileReadOption.SkipLargeTags);
        return true;
    }
    catch
    {
        return false;
    }
}

遍历调用逻辑和方案1一致,替换校验方法即可。

内容的提问来源于stack exchange,提问作者Sanktos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:27:06