HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
/*
typedef unsigned long DWORD;
如果执行成功 则返回文件句柄
如果执行失败 返回 INVALID_HANDLE_VALUE
lpFileName: 文件名 e.g."C:\\regedit.exe"
dwDesiredAccess: GENERIC_READ 允许对设备进行读访问 GENERIC_WRITE 允许对设备进行写访问
dwShareMode:
0 不共享
FILE_SHARE_DELITE删除访问请求则打开对象成功
FILE_SHARE_READ 请求读访问则打开对象成功
FILE_SHARED_WRITE 请求写访问则打开对象成功
lpSecurityAttributes: 指向一个SECURITY_ATTRIBUTES结构的指针 定义了文件的安全特性(如果操作系统支持的话)可以为NULL
dwCreationDisposition: 下述常数之一:
CREATE_NEW 创建文件 如文件存在则会出错
CREATE_ALWAYS 创建文件 会改写前一个文件
OPEN_EXISTING 文件必须已经存在 由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 将现有文件缩短为零长度
dwFlagsAndAttributes: 一个或多个下述常数
FILE_ATTRIBUTE_ARCHIVE 标记归档属性
FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
FILE_ATTRIBUTE_NORMAL 默认属性
FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录
FILE_ATTRIBUTE_READONLY 文件为只读
FILE_ATTRIBUTE_SYSTEM 文件为系统文件
FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化
FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化
FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件
也可在Windows NT下组合使用下述常数标记:
SECURITY_ANONYMOUS SECURITY_IDENTIFICATION SECURITY_IMPERSONATION SECURITY_DELEGATION SECURITY_CONTEXT_TRACKING SECURITY_EFFECTIVE_ONLY
hTemplateFile: 为一个文件或设备句柄 表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径 然后再打开)它将指定该文件的属性扩展到新创建的文件上面 这个参数可用于将某个新文件的属性设置成与现有文件一样 并且这样会忽略dwAttrsAndFlags 通常这个参数设置为NULL 为空表示不使用模板 一般为空
疑问:第二个和第三个参数的区别?
*/
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);
/*
返回值BOOL true表示成功 false表示失败 会设置GetLastError
lpExistingFileName: 源文件名
lpNewFileName: 目标文件名
bFailIfExists: 如果设为TRUE 那么一旦目标文件已经存在 则函数调用会失败 否则目标文件被改写
*/
BOOL MoveFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName
);
/*
移动一个存在的文件或者目录(包括子目录)
成功调用 返回true
失败调用 返回false
lpExistingFileName: 一个存在的文件或者文件夹字符串指针
lpNewFileName: 一个还没存在的文件或者文件夹的字符串指针
*/
BOOL DeleteFile(LPCSTR lpFileName);
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
/*
FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作
调用成功 返回true
调用不成功 返回为false
hFile: 需要读入数据的文件指针 这个指针指向的文件必须是GENERIC_READ访问属性的文件。
lpBuffer: 接收数据的缓冲区
nNumberOfBytesToRead: 指定要读取的字节数
pNumberOfBytesRead: 指向一个DWORD类型变量的指针 用来接收读取的字节 如果下一个参数为NULL 那么一定要传入这个参数
lpOverlapped: OVERLAPPED结构体指针 如果文件是以FILE_FLAG_OVERLAPPED方式打开的话 那么这个指针就不能为NULL 如果文件打开方式没有指明FILE_FLAG_OVERLAPPED 当程序调用成功时 它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中
疑问:最后2个参数有且只有一个为NULL?
*/
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORDlpNumberOfBytesWritten,
LPOVERLAPPEDlpOverlapped
);
/*
hFile: 需要写入数据的文件指针 这个指针指向的文件必须是GENERIC_WRITE访问属性的文件
其它参数与ReadFile相同
*/
BOOL CloseHandle(HANDLE hObject);
/*
关闭一个内核对象 包括文件 文件映射 进程 线程等
执行成功返回true 执行失败返回false
*/