CreateFile,SetFilePointer,WriteFile函数介绍

来源:互联网 发布:焊缝验算软件 编辑:程序博客网 时间:2024/06/05 11:06

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^3122G2),因为所有文件指针的值是有符号的。因此,就算文件只有很少的机会能够达到这个大小,我们最好还是把文件当成是一个大文件,并且在程序中使用64位的指针(就是lpDistanceToMoveHigh的值不是NULL)。如果我们有一个压缩的并且文件很少的NTFS文件系统中,即使当前盘的空间不是很大的情况下,也很可能会有一些大文件。

假如lpDistanceToMoveHigh传入的不是NULL,那么lpDistanceToMoveHighlDistanceToMove会组成一个有符号的64位值。lDistanceToMove参数是被作为这个值的低32们,lpDistanceToMoveHigh作为高32位,也就是说lpDistanceToMoveHighlDistanceToMove的符号扩展名。

为了从0移动到2G位置,lpDistanceToMoveHigh必须设置为NULL或当作lDistanceToMove的符号扩展名。为了移动到大于2G的位置,就要使用lpDistanceToMoveHighlDistanceToMove合成一个有符号的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

0 0
原创粉丝点击