WriteFile

【勇芳软件工作室】汉化HomePreviousNext

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