CreateFile
CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。
文件,pipes,邮槽,通信资源,磁盘驱动器(仅windowsNT ),控制台,文件夹(仅用于打开)
HANDLE CreateFile(
LPCTSTR lpFileName, // 指向文件名的指针
DWORD dwDesiredAccess, // 访问模式(写 / 读)
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针
DWORD dwCreationDisposition, // 如何创建
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 用于复制文件句柄
);
参数类型及说明
lpFileName要打开的文件的名字
dwDesiredAccess如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes SECURITY_ATTRIBUTES ,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
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如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性
返回值
如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。即使函数成功,但若文件存在,且指定了 CREATE_ALWAYS 或 OPEN_ALWAYS , GetLastError 也会设为 ERROR_ALREADY_EXISTS
SetFilePointer:
DWORD SetFilePointer(
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
文中对于第二个和第三个参数进行了详细的说明:
lpDistanceToMoveHigh 参数是用来管理大文件,如果要移到文件中任何位置,我们就必须设置这个参数的值。假如我们传入NULL值,那么lDistanceToMove 的最大值是2^31–2(2G-2),因为所有文件指针的值是有符号的。因此,就算文件只有很少的机会能够达到这个大小,我们最好还是把文件当成是一个大文件,并且在程序中使用64位的指针(就是lpDistanceToMoveHigh的值不是NULL)。如果我们有一个压缩的并且文件很少的NTFS文件系统中,即使当前盘的空间不是很大的情况下,也很可能会有一些大文件。
假如lpDistanceToMoveHigh传入的不是NULL,那么lpDistanceToMoveHigh和lDistanceToMove会组成一个有符号的64位值。lDistanceToMove参数是被作为这个值的低32们,lpDistanceToMoveHigh作为高32位,也就是说lpDistanceToMoveHigh是lDistanceToMove的符号扩展名。
为了从0移动到2G位置,lpDistanceToMoveHigh必须设置为NULL或当作lDistanceToMove的符号扩展名。为了移动到大于2G的位置,就要使用lpDistanceToMoveHigh和lDistanceToMove合成一个有符号的64位值。举个例子:为了从2G位置移到4G的位置,我们需要设置lpDistanceToMoveHigh的值为0或-1,让它作为lDistanceToMove的符号扩展名。
为了支持64位文件指针,你可以传一个LONG,把它当作64位文件指针的高位,并把它传给lpDistanceToMoveHigh。这就意味着你必须把两个不同的变量当作一个操作单元,要不然这可能会出错。最好还是使用LARGE_INTEGER结构来创建一个64位值,并且把其中两个union元素作为参数传入。
当然,最好还是写一个函数来替代SetFilePointer。下面是一个代码例子,用来演示你想要的功能。
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
{
LARGE_INTEGER li;
li.QuadPart = distance;
li.LowPart = SetFilePointer (hf,
li.LowPart,
&li.HighPart,
MoveMethod);
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
!= NO_ERROR)
{
li.QuadPart = -1;
}
return li.QuadPart;
}
WriteFile:
BOOL WriteFile(
HANDLEhFile,//文件句柄
LPCVOIDlpBuffer,//数据缓存区指针
DWORDnNumberOfBytesToWrite,//你要写的字节数
LPDWORDlpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPEDlpOverlapped//OVERLAPPED结构体指针
);
从文件指针指向的位置开始将数据写入到一个文件中, 且支持同步和异步操作,
如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际写入文件的字节数保存到lpNumberOfBytesWriten指明的地址空间中
如果文件要交互使用的话,当函数调用完毕时要记得调整文件指针
参数说明
HANDLE hFile, 需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_WRITE access 访问属性的文件
LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL
vc返回值
调用成功,返回非0
调用不成功,返回为0