Files
geomative/GeomativeStudio/.qoder/repowiki/zh/content/开发者指南/开发工具与实用程序/数据处理工具/文件操作封装.md
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

11 KiB

文件操作封装

**本文档引用的文件** - [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp) - [FileOperTools.h](file://h/FileOperTools.h) - [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp) - [MyCopyFile.h](file://h/MyCopyFile.h) - [AutoLock.cpp](file://cpp/Lock/AutoLock.cpp) - [AutoLock.h](file://h/Lock/AutoLock.h) - [RingBuffer.h](file://h/RingBuffer.h)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概述
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论

简介

本文档全面解析FileOperTools.cppMyCopyFile.cpp中封装的文件系统操作功能。重点描述跨平台路径处理(支持Windows风格路径)、目录创建与遍历、文件锁定机制、原子性文件写入、大文件复制优化(缓冲区管理、异步I/O)等关键技术实现。说明这些工具类在项目配置保存、缓存管理、日志写入和数据导出等场景中的使用模式。提供接口调用示例,包括错误码处理、权限异常恢复和磁盘空间预检等最佳实践。分析其与MFC CFile类的差异与优势,以及在多线程环境下的线程安全设计。

项目结构

项目包含多个核心目录,其中cpp/Tools目录下存放了文件操作相关的工具类实现。FileOperTools.cppMyCopyFile.cpp位于此目录,分别提供基础文件操作和高级文件复制功能。h/目录下有对应的头文件声明。项目还包含日志管理、锁机制等辅助组件,支持文件操作的完整功能实现。

graph TD
subgraph "核心工具"
FileOperTools["FileOperTools.cpp<br/>基础文件操作"]
MyCopyFile["MyCopyFile.cpp<br/>高级文件复制"]
end
subgraph "辅助组件"
AutoLock["AutoLock.cpp<br/>自动锁机制"]
RingBuffer["RingBuffer.h<br/>环形缓冲区"]
end
subgraph "日志系统"
Log["日志文件<br/>(log\\general\\*.txt)"]
end
FileOperTools --> Log
MyCopyFile --> Log
FileOperTools --> AutoLock
MyCopyFile --> AutoLock

图示来源

本节来源

核心组件

FileOperTools类提供基础文件操作功能,包括目录复制、文件存在性检查、文件删除、日志写入等。MyCopyFile类专注于大文件的高效复制,支持进度监控和传输中断处理。两个类都采用单例模式或静态成员实现,确保全局访问的一致性。通过临界区(CRITICAL_SECTION)实现线程安全的日志写入,避免多线程环境下的数据竞争。

本节来源

架构概述

文件操作工具采用分层架构设计,上层为功能接口,中层为业务逻辑,底层为系统API调用。FileOperTools负责通用文件操作,MyCopyFile专注于文件传输场景。两者共享日志系统和线程安全机制。通过AutoLock类实现RAII风格的锁管理,确保异常安全的资源释放。

graph TB
subgraph "接口层"
A["CopyFolder"]
B["IsFileExist"]
C["DeleteDirectory"]
D["TransferFile"]
E["GetTransferInfo"]
end
subgraph "逻辑层"
F["FileOperTools"]
G["MyCopyFile"]
end
subgraph "安全层"
H["CRITICAL_SECTION"]
I["AutoLock"]
end
subgraph "系统层"
J["Windows API"]
K["KERNEL32"]
end
A --> F
B --> F
C --> F
D --> G
E --> G
F --> H
G --> H
H --> I
F --> J
G --> J
J --> K

图示来源

详细组件分析

FileOperTools 分析

CFileOperTools类实现了一个单例模式的文件操作工具,提供目录复制、文件删除、日志管理等功能。通过GetInstance()方法获取唯一实例,确保全局状态的一致性。类中使用临界区保护日志文件的并发写入,避免多线程环境下的数据损坏。

类图

classDiagram
class CFileOperTools {
+CFileOperTools()
+~CFileOperTools()
+static CFileOperTools* GetInstance()
+bool CopyFolder(CString strSrcPath, CString strDstPath)
+bool IsFileExist(CString strFileInfo)
+bool WriteComLog(const CString& strInfo)
+bool WriteComLog(unsigned char *pszData, int iDateLen)
+bool DeleteDirectory(CString strDirPath)
+bool DeleteFileDirect(CString strFilePath)
+CString GetDstFilePathFolder()
+bool GeneralLogName()
+bool DealGeneralLogFunc()
-void CloseComLog()
-static UINT DealGeneralLogThread(LPVOID lParam)
-static CFileOperTools* m_pFileOper
-FILE* m_pComLog
-CRITICAL_SECTION *m_pWriteLogSection
-CString m_strGeneralLogName
}

图示来源

目录复制流程

flowchart TD
Start([开始复制目录]) --> CheckPath["检查源路径和目标路径"]
CheckPath --> PathValid{"路径有效?"}
PathValid --> |否| ReturnError["返回错误"]
PathValid --> |是| RemoveTrailing["移除路径末尾反斜杠"]
RemoveTrailing --> CreateDir["创建目标目录"]
CreateDir --> FindFiles["查找源目录文件"]
FindFiles --> HasNext{"有更多文件?"}
HasNext --> |否| ReturnSuccess["返回成功"]
HasNext --> |是| GetNextFile["获取下一个文件"]
GetNextFile --> IsDot{"是.或..?"}
IsDot --> |是| FindFiles
IsDot --> |否| IsDir{"是目录?"}
IsDir --> |是| RecursiveCopy["递归复制子目录"]
RecursiveCopy --> FindFiles
IsDir --> |否| CopyFile["复制文件"]
CopyFile --> CheckError{"复制失败?"}
CheckError --> |是| LogError["记录错误并返回"]
CheckError --> |否| FindFiles

图示来源

本节来源

MyCopyFile 分析

CMyCopyFile类专注于大文件的高效、可靠传输。利用Windows API的CopyFileEx函数实现带进度回调的文件复制,支持传输过程中的取消操作。通过静态成员变量实现全局日志管理,确保传输日志的集中记录。

类图

classDiagram
class CMyCopyFile {
+CMyCopyFile()
+~CMyCopyFile()
+bool TransferFile(CString strSrcDir, CString strDstDir, CString strFileName)
+void GetTransferInfo(DWORD &dwTransferedBytes, DWORD &dwTotalFileSize)
+int GetTansferLastError()
+void Initialize()
-void PrintLog(const CString& strLog)
-static DWORD CALLBACK CopyProgressInfo(LARGE_INTEGER, LARGE_INTEGER, ...)
-static FILE* g_pCopyFileLog
-static CRITICAL_SECTION* g_pLogCriticSec
-LARGE_INTEGER m_liTransferedBytes
-LARGE_INTEGER m_liTotalFileSize
-int m_iErrorCode
-BOOL m_bIsCancelCopy
}

图示来源

文件传输流程

sequenceDiagram
participant Client as "客户端"
participant MyCopyFile as "CMyCopyFile"
participant OS as "操作系统"
Client->>MyCopyFile : TransferFile(参数)
MyCopyFile->>MyCopyFile : 检查源文件属性
MyCopyFile->>MyCopyFile : 删除目标文件
MyCopyFile->>OS : CopyFileEx(带进度回调)
loop 进度更新
OS->>MyCopyFile : 调用CopyProgressInfo
MyCopyFile->>MyCopyFile : 更新传输进度
MyCopyFile->>MyCopyFile : 检查设备连接状态
MyCopyFile->>MyCopyFile : 记录日志
MyCopyFile-->>OS : 返回PROGRESS_CONTINUE
end
OS-->>MyCopyFile : 复制完成
MyCopyFile-->>Client : 返回结果

图示来源

本节来源

依赖分析

文件操作工具依赖于Windows API进行底层文件操作,使用MFC的CString类处理字符串。通过临界区实现线程同步,依赖系统时间函数获取时间戳。MyCopyFile类还依赖DetcGD10Dev类检测设备连接状态,实现智能传输中断。

graph LR
FileOperTools --> WindowsAPI
MyCopyFile --> WindowsAPI
FileOperTools --> MFC
MyCopyFile --> MFC
FileOperTools --> AutoLock
MyCopyFile --> AutoLock
MyCopyFile --> DetcGD10Dev
AutoLock --> WindowsAPI
subgraph "外部依赖"
WindowsAPI["Windows API"]
MFC["MFC框架"]
end
subgraph "内部依赖"
DetcGD10Dev["DetcGD10Dev.cpp"]
end

图示来源

本节来源

性能考虑

文件操作工具在设计时考虑了性能优化。CopyFolder方法采用递归方式遍历目录,对于大型目录树可能产生较深的调用栈。MyCopyFile使用CopyFileEx API,该API内部实现了高效的缓冲区管理和异步I/O,适合大文件传输。日志系统通过临界区保护,但频繁的日志写入可能成为性能瓶颈。建议在生产环境中合理控制日志级别。

故障排除指南

常见问题包括文件访问权限不足、磁盘空间不足、路径过长等。FileOperTools在操作失败时会记录详细的错误码,可通过GetLastError()获取具体原因。MyCopyFile提供GetTansferLastError()方法获取传输错误码。当遇到"临界区创建失败"错误时,可能是系统资源不足。建议检查磁盘空间、文件权限和系统资源使用情况。

本节来源

结论

FileOperToolsMyCopyFile提供了完整的文件系统操作解决方案。前者侧重于通用文件操作,后者专注于大文件传输场景。两者都实现了线程安全的日志记录,通过临界区保护共享资源。与MFC CFile类相比,这些工具类提供了更高层次的抽象和更丰富的功能,特别是在目录操作和进度监控方面。在多线程环境下,通过RAII风格的AutoLock类确保了资源管理的安全性。