在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格式化,输出分区表数据,监控目录变化等。
11.1 ReadFile
ReadFile是一个文件读取函数,该函数可以将一个文件读入到特定的缓冲区内,在读取之前读者需要自行调用CreateFileA
函数打开一个文件,首先来看一下打开文件的函数原型;
HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
函数创建或打开一个文件或输入输出(I/O)
设备的函数。函数返回一个类型为 HANDLE
的文件句柄,该句柄可用于后续对文件的读写操作。如果文件创建成功,返回值是文件的句柄;如果函数失败,则返回值是 INVALID_HANDLE_VALUE(-1)
。
参数说明:
- lpFileName:要打开的文件名或设备名,该参数可以是完整路径名、相对路径名或文件名和相对路径名的组合。
- dwDesiredAccess:要求对文件进行的访问类型,如 GENERIC_READ 或 GENERIC_WRITE,也可以同时指定。
- dwShareMode:其他进程访问该文件时的共享模式,如 FILE_SHARE_READ 或 FILE_SHARE_WRITE。
- lpSecurityAttributes:一个指向 SECURITY_ATTRIBUTES 结构的指针,指定文件的安全属性。该参数可以为空,表示文件没有安全属性。
- dwCreationDisposition:如何创建新的文件,如 CREATE_NEW 或 OPEN_ALWAYS。
- dwFlagsAndAttributes:文件的属性和标志,如 FILE_ATTRIBUTE_NORMAL 或 FILE_FLAG_BACKUP_SEMANTICS。
- hTemplateFile:文件句柄,该文件句柄必须是 GENERIC_READ 访问类型的文件。
接着是ReadFile
函数的原型定义;
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
参数说明:
- hFile: 要读取的文件句柄
- lpBuffer: 指向用于存储读取数据的缓冲区的指针
- nNumberOfBytesToRead: 要读取的字节数
- lpNumberOfBytesRead: 返回实际读取的字节数的指针
- lpOverlapped: 指定了异步读取的选项。如果想要同步读取,该参数可以为NULL。
该函数如果函数成功读取,则返回非零值,lpNumberOfBytesRead
指向的变量将被设置为实际读取的字节数,如果函数失败,则返回零。要获取扩展错误信息,可调用GetLastError()
函数。
#include <iostream>
#include <Windows.h>
int main(int argc, char* argv[])
{
HANDLE hFile;
DWORD fileSize, readSize;
char* buffer;
hFile = CreateFile(
"d:\lyshark.exe", // 文件名
GENERIC_READ, // 读取权限
0, // 阻止其他进程访问
NULL, // 子进程不可继承本句柄
OPEN_EXISTING, // 仅当该文件或设备存在时,打开它
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL); // 不适用模板文件
if (hFile == INVALID_HANDLE_VALUE)
{
return 0;
}
fileSize = GetFileSize(hFile, NULL); // 获取文件大小
buffer = (char*)malloc(fileSize 1); // 获取一块内存
buffer[fileSize] = '