CreateFile
函数原型:
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);
参数列表:
lpFileName String
要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。
dwDesiredAccess Long
如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息。
dwShareMode Long,
零表示不共享; FILE_SHARE_READ 和/或 FILE_SHARE_WRITE 表示允许对文件进行共享访。
lpSecurityAttributes SECURITY_ATTRIBUTES
指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition Long,
下述常数之一:
CREATE_NEW 创建文件;如文件存在则会出错
CREATE_ALWAYS 创建文件,会改写前一个文件
OPEN_EXISTING 文件必须已经存在。由设备提出要求
OPEN_ALWAYS 如文件不存在则创建它
TRUNCATE_EXISTING 讲现有文件缩短为零长度
dwFlagsAndAttributes Long,
一个或多个下述常数
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 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件 。
---------------------------------------------------------
WriteFile
函数原型:
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据缓存区指针
DWORD nNumberOfBytesToWrite, // 你要写的字节数
LPDWORD lpNumberOfBytesWritten, // 用于保存实际写入字节数的存储区域的指针 LPOVERLAPPED lpOverlapped // OVERLAPPED结构体指针
);
参数列表:
HANDLE hFile
需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_WRITE access 访问属性的文件。
LPCVOID lpBuffer
lpBuffer为LPCVOID,所以任何数据类型的指针都可以。
DWORD nNumberOfBytesToWrite
lpBuffer指向的数据的字节数。
LPDWORD lpNumberOfBytesWritten
用于保存实际写入字节数的存储区域的指针,例如:DWORD dw 即可。
LPOVERLAPPED lpOverlapped
OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。
--------------------------------------------------------
SetFilePointer
函数原型:
DWORD SetFilePointer(
HANDLE hFile, // 文件句柄
LONG lDistanceToMove, // 偏移量(低位)
PLONG lpDistanceToMoveHigh, // 偏移量(高位)
DWORD dwMoveMethod // 基准位置,FILE_BEGIN:文件开始位置 ,FILE_CURRENT:文件当前位置, FILE_END:文件结束位置
);
--------------------------------------------------------
DeleteFile
函数原型:
BOOL DeleteFile(
LPCTSTR lpFileName // 文件名指针
);
--------------------------------------------------------
MoveFile
函数原型:
BOOL MoveFile(
LPCTSTR lpExistingFileName, // file name
LPCTSTR lpNewFileName // new file name
);
函数功能 : 移动一个存在的文件或者目录(包括子目录)
参数说明 :
lpExistingFileName 一个存在的文件或者文件夹字符串指针
lpNewFileName 一个还没存在的文件或者文件夹的字符串指针
----------------------------------------------------------
MoveFileEx
函数原型:
BOOL MoveFileEx(
LPCTSTR lpExistingFileName, // file name
LPCTSTR lpNewFileName, // new file name
DWORD dwFlags // move options
);
参数说明:
lpExistingFileName,一个存在的文件或者文件夹字符串指针
lpNewFileName ,一个还没存在的文件或者文件夹的字符串指针
dwFlags ,一个或多个下述常数:
MOVEFILE_COPY_ALLOWED
如移动到一个不同的卷,则复制文件并删除原来的文件。
MOVEFILE_CREATE_HARDLINK
系统保留,以供将来使用。
MOVEFILE_DELAY_UNTIL_REBOOT
移动操作在系统下次重新启动时正式进行。注册表修改处:HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet /Control/Session/Manager/PendingFileRenameOperations。
MOVEFILE_FAIL_IF_NOT_TRACKABLE
如果来源文件是一个 LINK 文件,但是文件在移动后不能够被 TRACKED,则函数执行失败。如果目标文件在一个 FAT 格式的文件系统上,则上述情况可以发生。这个参数不支持 NT 系统。(我想这里说的可能是移动快捷方式的情况,如果快捷方式指定的目标文件不存在或无法定位,则操作失败,由于没有时间测试,暂时这样理解。)
MOVEFILE_REPLACE_EXISTING
如目标文件存在,则将其替换 。
MOVEFILE_WRITE_THROUGH
这个标记允许函数在执行完文件移动操作后才返回,否者不等文件移动完毕就直接返回。如果设置了 MOVEFILE_DELAY_UNTIL_REBOOT 标记,则 MOVEFILE_WRITE_THROUGH 标记将被忽略。
例如:
//对于已经存在的txt文件追加信息
void CTestDlg::OnBtnTest()
{
CString path(_T("test.txt"));
//OPEN_ALWAYS保证原文件不会被删除,以及原来文件内容不被修改
HANDLE hHandle = CreateFile(path.GetBuffer(0),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hHandle == INVALID_HANDLE_VALUE)
MessageBox("Failed");
else
{
DWORD dw;
CString sText(_T("test"));
//将文件指针指向文件结束位置,达到追加的效果
SetFilePointer(hHandle,0,NULL,FILE_END);
if(WriteFile(hHandle,sText.GetBuffer(0),sText.GetLength(),&dw,NULL))
MessageBox("ok");
//再次追加
SetFilePointer(hHandle,0,NULL,FILE_END);
if(WriteFile(hHandle,sText.GetBuffer(0),sText.GetLength(),&dw,NULL))
MessageBox("ok1");
}
//删除文件,如果失败,再用MovieFileEx
if(!DeleteFile(path.GetBuffer(0)))
{
MoveFileEx(path.GetBuffer(0),NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
}
//之所以在这才关闭,是为了验证MoveFileEx
CloseHandle(hHandle);
}