WriteFile函数将数据写入一个文件,并设计用于同步和异步操作。该函数开始在文件指针指示的位置将数据写入文件。写入操作完成后,文件指针将按实际写入的字节数进行调整,除非使用FILE_FLAG_OVERLAPPED打开文件。如果为重叠输入和输出(I / O)创建了文件句柄,则在写操作完成后,应用程序必须调整文件指针的位置。
BOOL WriteFile(
HANDLE 【HFILE】, | //处理要写入的文件 |
LPCVOID 【lpBuffer】, | //指向要写入文件的数据的指针 |
DWORD 【nNumberOfBytesToWrite】, | //要写入的字节数 |
LPDWORD 【lpNumberOfBytesWritten】, | //指向写入字节数的指针 |
LPOVERLAPPED 【lpOverlapped的】 | //指向重叠I / O所需的结构的指针 |
); |
参数
【HFILE】
标识要写入的文件。必须使用GENERIC_WRITE访问该文件创建文件句柄。
Windows NT
对于异步写入操作,【HFILE】可以是使用CreateFile函数的FILE_FLAG_OVERLAPPED标志打开的任何句柄,或由插座或接受函数返回的套接字句柄。
Windows 95
对于异步写入操作,【HFILE】可以是通过CreateFile FILE_FLAG_OVERLAPPED标志打开的通信资源,邮槽或命名管道句柄,或插座或接受函数返回的套接字句柄。Windows 95不支持对磁盘文件进行异步写操作。
【lpBuffer】
指向包含要写入文件的数据的缓冲区。
【nNumberOfBytesToWrite】
指定要写入文件的字节数。
与MS-DOS操作系统不同,Windows NT将零值解释为指定空写入操作。空写入操作不会写任何字节,但会导致时间戳更改。
通过网络命名的管道写入操作限制为65535个字节。
【lpNumberOfBytesWritten】
指向此函数调用写入的字节数。WriteFile在进行任何工作或错误检查之前将此值设置为零。
如果【lpOverlapped的】为NULL,则【lpNumberOfBytesWritten】不能为NULL。
如果【lpOverlapped的】不为NULL,则【lpNumberOfBytesWritten】可以为NULL。如果这是一个重叠的写入操作,您可以通过调用GetOverlappedResult获取写入的字节数。如果【HFILE】与I / O完成端口相关联,则可以通过调用GetQueuedCompletionStatus获取写入的字节数。
【lpOverlapped的】
指向OVERLAPPED结构。如果使用FILE_FLAG_OVERLAPPED打开【HFILE】,则需要此结构。
如果使用FILE_FLAG_OVERLAPPED打开【HFILE】,则【lpOverlapped的】参数不能为NULL。它必须指向一个有效的OVERLAPPED结构。如果使用FILE_FLAG_OVERLAPPED打开【HFILE】,并且【lpOverlapped的】为NULL,则该函数可能会错误地报告写入操作已完成。
如果使用FILE_FLAG_OVERLAPPED打开【HFILE】,并且【lpOverlapped的】不为NULL,则写操作从OVERLAPPED结构中指定的偏移开始,并且WriteFile可能在写操作完成之前返回。在这种情况下,WriteFile返回FALSE,GetLastError函数返回ERROR_IO_PENDING。这允许调用进程在写入操作完成时继续处理。OVERLAPPED结构中指定的事件在写入操作完成后设置为信号状态。
如果【HFILE】未使用FILE_FLAG_OVERLAPPED打开,并且【lpOverlapped的】为NULL,则写入操作从当前文件位置开始,并且WriteFile不会返回,直到操作完成。
如果【HFILE】未使用FILE_FLAG_OVERLAPPED打开,并且【lpOverlapped的】不为NULL,则写入操作从OVERLAPPED结构中指定的偏移开始,并且WriteFile不会返回,直到写入操作完成。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.
备注
如果文件的一部分被其他进程锁定,并且写入操作与锁定部分重叠,则此函数失败。
写入操作完成之前,应用程序不得从写入操作直接读取或写入输出缓冲区。输出缓冲区的过早访问可能导致从该缓冲区写入的数据的损坏。
可以使用WriteFile将控件输出的句柄写入屏幕缓冲区。该函数的确切行为由控制台模式决定。数据被写入当前的光标位置。写操作后光标位置被更新。
与MS-DOS操作系统不同,Windows NT会将零字节解释为指定空写入操作,并且WriteFile不会截断或扩展文件。要截断或扩展文件,请使用SetEndOfFile功能。
当写入不阻塞的字节模式管道句柄,缓冲区空间不足时,WriteFile 【*lpNumberOfBytesWritten】 < 【nNumberOfBytesToWrite】返回TRUE。
当应用程序使用WriteFile函数写入管道时,如果管道缓冲区已满,则写入操作可能无法完成。读取操作(使用ReadFile功能)可以使更多缓冲区可用时,写操作完成。
如果匿名读取管道句柄已关闭,并且WriteFile尝试使用相应的匿名写入管道句柄进行写入,则函数返回FALSE,GetLastError返回ERROR_BROKEN_PIPE。
当异常I / O请求过多时,WriteFile功能可能会以ERROR_INVALID_USER_BUFFER或ERROR_NOT_ENOUGH_MEMORY的形式出现。
要取消所有挂起的异步I / O操作,请使用CancelIO功能。此函数仅取消调用线程为指定的文件句柄发出的操作。取消的I / O操作完成,错误ERROR_OPERATION_ABORTED。
如果【HFILE】是命名管道的句柄,则【lpOverlapped的】指向的OVERLAPPED结构的抵消和OffsetHigh成员必须为零,否则函数将失败。
也可以看看
CancelIo, CreateFile, GetLastError, GetOverlappedResult, GetQueuedCompletionStatus, OVERLAPPED, ReadFile, SetEndOfFile, WriteFileEx