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
相关产品推荐
相关产品推荐

