# 文件操作封装
**本文档引用的文件**
- [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.cpp`和`MyCopyFile.cpp`中封装的文件系统操作功能。重点描述跨平台路径处理(支持Windows风格路径)、目录创建与遍历、文件锁定机制、原子性文件写入、大文件复制优化(缓冲区管理、异步I/O)等关键技术实现。说明这些工具类在项目配置保存、缓存管理、日志写入和数据导出等场景中的使用模式。提供接口调用示例,包括错误码处理、权限异常恢复和磁盘空间预检等最佳实践。分析其与MFC CFile类的差异与优势,以及在多线程环境下的线程安全设计。
## 项目结构
项目包含多个核心目录,其中`cpp/Tools`目录下存放了文件操作相关的工具类实现。`FileOperTools.cpp`和`MyCopyFile.cpp`位于此目录,分别提供基础文件操作和高级文件复制功能。`h/`目录下有对应的头文件声明。项目还包含日志管理、锁机制等辅助组件,支持文件操作的完整功能实现。
```mermaid
graph TD
subgraph "核心工具"
FileOperTools["FileOperTools.cpp
基础文件操作"]
MyCopyFile["MyCopyFile.cpp
高级文件复制"]
end
subgraph "辅助组件"
AutoLock["AutoLock.cpp
自动锁机制"]
RingBuffer["RingBuffer.h
环形缓冲区"]
end
subgraph "日志系统"
Log["日志文件
(log\\general\\*.txt)"]
end
FileOperTools --> Log
MyCopyFile --> Log
FileOperTools --> AutoLock
MyCopyFile --> AutoLock
```
**图示来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
- [AutoLock.cpp](file://cpp/Lock/AutoLock.cpp#L1-L12)
**本节来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
## 核心组件
`FileOperTools`类提供基础文件操作功能,包括目录复制、文件存在性检查、文件删除、日志写入等。`MyCopyFile`类专注于大文件的高效复制,支持进度监控和传输中断处理。两个类都采用单例模式或静态成员实现,确保全局访问的一致性。通过临界区(CRITICAL_SECTION)实现线程安全的日志写入,避免多线程环境下的数据竞争。
**本节来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
- [FileOperTools.h](file://h/FileOperTools.h#L1-L42)
- [MyCopyFile.h](file://h/MyCopyFile.h#L1-L48)
## 架构概述
文件操作工具采用分层架构设计,上层为功能接口,中层为业务逻辑,底层为系统API调用。`FileOperTools`负责通用文件操作,`MyCopyFile`专注于文件传输场景。两者共享日志系统和线程安全机制。通过`AutoLock`类实现RAII风格的锁管理,确保异常安全的资源释放。
```mermaid
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.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
- [AutoLock.cpp](file://cpp/Lock/AutoLock.cpp#L1-L12)
## 详细组件分析
### FileOperTools 分析
`CFileOperTools`类实现了一个单例模式的文件操作工具,提供目录复制、文件删除、日志管理等功能。通过`GetInstance()`方法获取唯一实例,确保全局状态的一致性。类中使用临界区保护日志文件的并发写入,避免多线程环境下的数据损坏。
#### 类图
```mermaid
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
}
```
**图示来源**
- [FileOperTools.h](file://h/FileOperTools.h#L11-L42)
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
#### 目录复制流程
```mermaid
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
```
**图示来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L58-L124)
**本节来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [FileOperTools.h](file://h/FileOperTools.h#L1-L42)
### MyCopyFile 分析
`CMyCopyFile`类专注于大文件的高效、可靠传输。利用Windows API的`CopyFileEx`函数实现带进度回调的文件复制,支持传输过程中的取消操作。通过静态成员变量实现全局日志管理,确保传输日志的集中记录。
#### 类图
```mermaid
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
}
```
**图示来源**
- [MyCopyFile.h](file://h/MyCopyFile.h#L18-L48)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
#### 文件传输流程
```mermaid
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 : 返回结果
```
**图示来源**
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L76-L107)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L137-L154)
**本节来源**
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
- [MyCopyFile.h](file://h/MyCopyFile.h#L1-L48)
## 依赖分析
文件操作工具依赖于Windows API进行底层文件操作,使用MFC的CString类处理字符串。通过临界区实现线程同步,依赖系统时间函数获取时间戳。`MyCopyFile`类还依赖`DetcGD10Dev`类检测设备连接状态,实现智能传输中断。
```mermaid
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
```
**图示来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L5-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L5-L155)
- [AutoLock.cpp](file://cpp/Lock/AutoLock.cpp#L1-L12)
**本节来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
- [AutoLock.cpp](file://cpp/Lock/AutoLock.cpp#L1-L12)
## 性能考虑
文件操作工具在设计时考虑了性能优化。`CopyFolder`方法采用递归方式遍历目录,对于大型目录树可能产生较深的调用栈。`MyCopyFile`使用`CopyFileEx` API,该API内部实现了高效的缓冲区管理和异步I/O,适合大文件传输。日志系统通过临界区保护,但频繁的日志写入可能成为性能瓶颈。建议在生产环境中合理控制日志级别。
## 故障排除指南
常见问题包括文件访问权限不足、磁盘空间不足、路径过长等。`FileOperTools`在操作失败时会记录详细的错误码,可通过`GetLastError()`获取具体原因。`MyCopyFile`提供`GetTansferLastError()`方法获取传输错误码。当遇到"临界区创建失败"错误时,可能是系统资源不足。建议检查磁盘空间、文件权限和系统资源使用情况。
**本节来源**
- [FileOperTools.cpp](file://cpp/Tools/FileOperTools.cpp#L1-L420)
- [MyCopyFile.cpp](file://cpp/Tools/MyCopyFile.cpp#L1-L155)
## 结论
`FileOperTools`和`MyCopyFile`提供了完整的文件系统操作解决方案。前者侧重于通用文件操作,后者专注于大文件传输场景。两者都实现了线程安全的日志记录,通过临界区保护共享资源。与MFC CFile类相比,这些工具类提供了更高层次的抽象和更丰富的功能,特别是在目录操作和进度监控方面。在多线程环境下,通过RAII风格的`AutoLock`类确保了资源管理的安全性。