项目源码链接:
实现文件拷贝功能(限制5GB大小) · 81c57de · 周不才/cpp_linux study - Gitee.com
知识准备:
1.句柄
句柄是一个用于标识和引用系统资源(如文件、窗口、进程、线程、位图等)的值。它不是资源的直接内存地址,而是一种间接引用
HANDLE是一种通用句柄,用于操作文件、线程、进程
2.LARGE_INTEGER
LARGE_INTEGER是一个联合体,用来在32位和64位系统上以一致的方式处理64位整数
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart; // 低32位
LONG HighPart; // 高32位(注意:LONG是有符号的)
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart; // 完整的64位整数
} LARGE_INTEGER;
3.GetFileAttributesA()函数
DWORD GetFileAttributesA(LPCSTR lpFileName);
功能:获取指定路径下文件/目录的属性
参数:LPCSTR类型是32位常量字符串指针,lpFileName即为文件路径
输出:成功返回DWORD值(位掩码),包含文件/目录属性集;失败返回INVALID_FILE_ATTRIBUTES,调用GetLastError()获取详细错误信息
4.GetLastError()函数
DWORD GetLastError();
功能:获取错误信息
输出: 返回DWORD错误代码
5.CreateFileA()函数
HANDLE CreateFileA(
LPCSTR lpFileName, // 文件路径字符串(ANSI)
DWORD dwDesiredAccess, // 访问模式(读/写)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性(通常为NULL)
DWORD dwCreationDisposition, // 文件存在或不存在时的操作
DWORD dwFlagsAndAttributes, // 文件属性和标志
HANDLE hTemplateFile // 模板文件句柄(通常为NULL)
);
功能:用于创建或打开文件,并返回一个可以操作文件的句柄
输出:成功返回操作文件的句柄,失败返回INVALID_HANDLE_VALUE
6.GetFileSizeEx()函数
BOOL GetFileSizeEx(
HANDLE hFile, //已打开文件的句柄(从CreateFile获得)
PLARGE_INTEGER lpFileSize //指向[LARGE_INTEGER]结构体的指针,用于接收文件大小
);
功能:通过句柄获取文件大小
输出:成功返回true,失败返回false
7.strncpy_s()函数
errno_t strncpy_s(
char* dest, // 目标缓冲区
size_t destSize, // 目标缓冲区大小(字节数)
const char* src, // 源字符串
size_t count // 最大复制字符数
);
功能:安全的字符串复制函数,缓冲区溢出保护以及自动添加终止符
输出:成功返回0,失败返回 EINVAL(参数无效,空指针)或 ERANGE(缓冲区太小或count值无效)
8.PathRemoveFileSpecA()函数
BOOL PathRemoveFileSpecA(
LPSTR pszPath // 指向文件路径的指针
);
功能:从文件路径中移除文件名部分,只保留目录路径
输出:成功返回true,失败返回false
9.PathCanonicalizeA()函数
BOOL PathCanonicalizeA(
LPSTR pszBuf, // 接收规范化路径的缓冲区
LPCSTR pszPath // 源路径字符串
);
功能:规范化文件路径,去除路径中的相对路径和冗余符号,但是不会移除末尾反斜杠
输出:成功返回true,失败返回false
10._strcmpi()函数
int _strcmpi(
const char *string1,
const char *string2
);
功能:不区分大小写的字符串比较
输出:相同输出0
11.PathFindFileNameA()函数
LPSTR PathFindFileNameA(
[in] LPCSTR pszPath
);
功能:从文件路径中提取出文件名部分,包括其扩展名(查找最后一个 \ 或 / ,并返回该分隔符之后的字符串)
输出:文件名字符串
12.snprintf()函数
int snprintf(
char* buffer, // 目标缓冲区指针
size_t size, // 缓冲区大小
const char* format, // 格式字符串
... // 可变参数列表
);
功能:按照指定格式拼接多个字符串到指定缓冲区中
13.HeapAlloc()函数
DECLSPEC_ALLOCATOR LPVOID HeapAlloc(
[in] HANDLE hHeap, // 堆句柄
[in] DWORD dwFlags, // 分配选项
[in] SIZE_T dwBytes // 分配字节数
);
功能:从指定的堆中动态分配内存块,Windows平台下替代malloc
输出:成功返回分配的到的内存地址,失败返回NULL
14.ReadFile()函数
BOOL ReadFile(
HANDLE hFile, // 文件句柄
LPVOID lpBuffer, // 接收数据的缓冲区
DWORD nNumberOfBytesToRead, // 要读取的字节数
LPDWORD lpNumberOfBytesRead, // 接收实际读取字节数的指针
LPOVERLAPPED lpOverlapped // 异步操作结构指针
);
功能:从文件中读取数据
15.WriteFile()函数
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 包含数据的缓冲区
DWORD nNumberOfBytesToWrite,// 要写入的字节数
LPDWORD lpNumberOfBytesWritten,// 接收实际写入字节数的指针
LPOVERLAPPED lpOverlapped // 异步操作结构指针
);
功能:向文件中写入数据