# 数据处理工具 **Referenced Files in This Document** - [Crc16.cpp](file://cpp/Tools/Crc16.cpp) - [Crc16.h](file://h/Crc16.h) - [Crc32.cpp](file://cpp/Tools/Crc32.cpp) - [Crc32.h](file://h/Crc32.h) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp) - [FileOperTools.h](file://h/FileOperTools.h) - [Markup.cpp](file://cpp/Tools/Markup.cpp) - [Markup.h](file://h/Markup.h) - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp) - [OperTxtFile.h](file://h/OperTxtFile.h) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp) - [OperUrfFile.h](file://h/OperUrfFile.h) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp) - [Res3DDatFile.h](file://h/Res3DDatFile.h) ## 目录 1. [引言](#引言) 2. [数据完整性校验工具](#数据完整性校验工具) 3. [文件操作工具](#文件操作工具) 4. [XML配置文件处理](#xml配置文件处理) 5. [特定格式数据文件处理](#特定格式数据文件处理) 6. [三维测量结果数据处理](#三维测量结果数据处理) 7. [应用场景与使用示例](#应用场景与使用示例) 8. [内存管理与性能优化](#内存管理与性能优化) 9. [错误恢复策略](#错误恢复策略) 10. [结论](#结论) ## 引言 GeomativeStudio中的数据处理工具集为地质勘探数据的完整性校验、文件操作、配置管理及数据存储提供了全面的解决方案。这些工具在项目配置保存、测量数据导出和缓存管理等关键场景中发挥着重要作用。本文档将深入解析Crc16.cpp和Crc32.cpp实现的数据完整性校验机制,FileOperTools.cpp封装的文件操作接口,Markup.cpp对XML配置文件的解析与生成逻辑,以及OperTxtFile.cpp、OperUrfFile.cpp和Res3DDatFile.cpp对特定格式数据文件的读写实现。 ## 数据完整性校验工具 ### CRC16校验实现 Crc16类实现了基于查表法的CRC16校验算法,通过预计算的256项查找表优化性能。该类采用静态成员变量`table`存储预计算的校验值,并使用`initialized`标志确保表只初始化一次。构造函数接收初始值,通过位运算和多项式0x1021进行校验计算。`update`方法对每个输入字节进行处理,利用查表法快速更新校验值,避免了重复的多项式除法运算。 **Section sources** - [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L28-L54) - [Crc16.h](file://h/Crc16.h#L12-L37) ### CRC32校验实现 Crc32类实现了CRC32校验算法,同样采用查表优化技术。与CRC16类似,它使用静态`table`数组存储预计算值,并通过`initialized`标志控制初始化。构造函数使用多项式0xEDB88320L进行表的生成,该多项式是CRC32标准算法的核心。`update`方法通过查表和位移操作高效更新校验值,确保数据完整性验证的高性能。 **Section sources** - [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L28-L51) - [Crc32.h](file://h/Crc32.h#L12-L37) ## 文件操作工具 ### 文件操作接口封装 CFileOperTools类封装了常用的文件操作功能,提供了一个单例模式的全局访问点。该类实现了目录复制、文件存在性检查、文件删除、日志写入等核心功能。`CopyFolder`方法递归复制目录及其内容,`DeleteDirectory`方法递归删除目录树,确保了文件系统操作的完整性和可靠性。 **Section sources** - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L58-L124) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L261-L323) - [FileOperTools.h](file://h/FileOperTools.h#L12-L42) ### 文件锁定与日志机制 该工具类实现了线程安全的日志写入机制,使用临界区(CRITICAL_SECTION)保护日志文件的并发访问。`WriteComLog`方法在写入日志前获取临界区锁,确保多线程环境下的数据一致性。同时,类提供了`CloseComLog`方法正确释放资源,防止内存泄漏。`DealGeneralLogFunc`方法创建后台线程定期清理过期日志文件,实现了自动化的日志管理。 **Section sources** - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L21-L37) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L150-L197) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L345-L398) ## XML配置文件处理 ### XML解析与生成逻辑 CMarkup类提供了完整的XML文档处理能力,支持文档加载、元素查找、属性读取、内容修改等操作。该类采用内部状态机解析XML文档,通过`FindElem`方法定位元素,`GetAttrib`和`GetData`方法提取属性和内容。`AddElem`和`SetData`方法允许动态修改文档结构,支持创建和更新XML配置文件。 **Section sources** - [Markup.cpp](file://cpp/Tools/Markup.cpp#L265-L291) - [Markup.h](file://h/Markup.h#L276-L305) ### 编码转换与字符处理 CMarkup类内置了强大的编码转换功能,支持UTF-8、UTF-16、UTF-32等多种编码格式的相互转换。通过`TextEncoding`结构体和相关方法,实现了跨平台的字符集处理。`x_GetEncodingCodePage`函数使用哈希表快速查找编码对应的代码页,`PerformConversion`方法执行实际的编码转换,确保XML文档在不同环境下的正确读写。 **Section sources** - [Markup.cpp](file://cpp/Tools/Markup.cpp#L183-L764) - [Markup.h](file://h/Markup.h#L387-L394) ## 特定格式数据文件处理 ### 文本文件操作 COperTxtFile类专门处理文本文件的读写操作,提供了参数化宽度的文本写入功能。`SetParamWidth`方法设置输出字段宽度,`WriteFileContent`方法将字符串数组按指定宽度格式化写入文件,不足部分用空格填充。该类还实现了错误检查和日志记录,确保文件操作的可靠性和可追溯性。 **Section sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L39-L57) - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L104-L158) - [OperTxtFile.h](file://h/OperTxtFile.h#L12-L32) ### URF文件处理 COperUrfFile类负责URF(Universal Resistivity data File)格式文件的生成,支持多种电极阵列配置。该类提供了`WriteElecByAR`系列方法,根据不同的装置类型(如温纳-施伦贝格尔、跨孔等)生成相应的电极坐标信息。`WriteUrfHeadInfo`方法创建文件头,包含格式说明和单位信息,确保文件的标准化和可读性。 **Section sources** - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L64-L77) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L506-L538) - [OperUrfFile.h](file://h/OperUrfFile.h#L12-L52) ## 三维测量结果数据处理 ### 三维数据文件结构 CRes3DDatFile类处理三维测量结果数据的结构化存储,采用特定的二进制文件格式。该类定义了文件头、记录和文件尾三部分结构,通过`WriteHead`、`WriteRecord`和`WriteTail`方法分别写入。文件头包含标题、网格尺寸、间距和介质类型等元数据,记录部分存储具体的测量点数据。 **Section sources** - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L189-L257) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L260-L322) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L325-L351) - [Res3DDatFile.h](file://h/Res3DDatFile.h#L28-L31) ### 数据记录管理 该类使用CPtrArray管理测量记录,通过`AddRecord`方法添加新的测量点,`DelRecord`和`ClearAllRecord`方法删除记录。`Generate`方法协调整个文件生成过程,先创建文件,然后依次写入头部、记录和尾部信息。`SetMedium`方法将用户友好的介质代码转换为内部表示,确保数据的一致性和正确性。 **Section sources** - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L100-L165) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L353-L386) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L168-L187) ## 应用场景与使用示例 ### 项目配置保存 在项目配置保存场景中,Markup类用于序列化应用程序设置到XML文件。通过`SetDoc`方法加载现有配置或创建新文档,使用`AddElem`和`AddAttrib`方法添加配置项,最后调用`Save`方法持久化到磁盘。这种机制确保了配置数据的结构化存储和跨会话持久性。 **Section sources** - [Markup.cpp](file://cpp/Tools/Markup.cpp#L344-L346) - [Markup.cpp](file://cpp/Tools/Markup.cpp#L346-L348) ### 测量数据导出 测量数据导出功能结合使用OperTxtFile和OperUrfFile类,将采集的测量结果转换为标准格式。对于文本报告,使用OperTxtFile按固定宽度格式化输出;对于专业分析,使用OperUrfFile生成URF格式文件,包含电极配置和测量数据。这种多格式支持满足了不同用户和软件的需求。 **Section sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L104-L158) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L506-L538) ### 缓存管理 缓存管理利用FileOperTools类的目录操作功能,实现缓存文件的自动清理。`DealGeneralLogThread`方法扫描日志目录,识别并删除两天前的旧文件,防止磁盘空间耗尽。`CopyFolder`和`DeleteDirectory`方法支持缓存的备份和重置,确保系统稳定运行。 **Section sources** - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L346-L398) ## 内存管理与性能优化 ### 查表法优化 CRC校验算法采用查表法进行性能优化,将复杂的多项式除法运算转换为简单的查表操作。Crc16和Crc32类在首次使用时预计算256个可能的余数,存储在静态数组中。后续计算只需一次查表和几次位运算,大大提高了处理速度,特别适合处理大量数据的场景。 **Section sources** - [Crc16.cpp](file://cpp/Tools/Crc16.cpp#L38-L50) - [Crc32.cpp](file://cpp/Tools/Crc32.cpp#L38-L47) ### 资源管理 所有文件操作类都实现了正确的资源管理,确保文件句柄和内存的及时释放。析构函数中调用`CloseFile`或`CloseComLog`关闭文件,`ClearAllRecord`方法释放动态分配的记录对象。这种RAII(资源获取即初始化)模式防止了资源泄漏,提高了系统的稳定性和可靠性。 **Section sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L27-L35) - [OperUrfFile.cpp](file://cpp/Tools/OperUrfFile.cpp#L26-L29) - [Res3DDatFile.cpp](file://cpp/Tools/Res3DDatFile.cpp#L35-L36) ## 错误恢复策略 ### 异常处理与日志记录 数据处理工具集实现了全面的错误检测和恢复机制。每个关键操作都包含输入验证和边界检查,如`OpenFileforWrite`检查文件名是否为空。操作失败时,通过`WriteComLog`记录详细的错误信息,包括错误码和上下文,便于问题诊断和恢复。 **Section sources** - [OperTxtFile.cpp](file://cpp/Tools/OperTxtFile.cpp#L69-L97) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L150-L197) ### 事务性操作 对于复杂的文件操作,如目录复制和删除,采用事务性设计原则。操作过程中持续检查状态,一旦发现错误立即停止并记录,避免部分完成的状态。`CopyFolder`方法在复制每个文件前检查源和目标路径,`DeleteDirectory`方法在删除每个子项前验证其存在性,确保操作的原子性和一致性。 **Section sources** - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L58-L124) - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L261-L323) ## 结论 GeomativeStudio的数据处理工具集通过精心设计的类和方法,提供了高效、可靠的数据完整性校验、文件操作和数据存储功能。CRC校验工具采用查表法优化性能,文件操作工具确保线程安全和资源正确管理,XML处理工具支持复杂的配置管理,特定格式文件处理工具满足专业数据交换需求。这些工具协同工作,为地质勘探应用提供了坚实的数据处理基础,确保了数据的完整性、一致性和可追溯性。