CreateFile,ReadFile 详解(msdn翻译)

 

CreateFile

The CreateFile function creates or opens the following objects and returns a handle that can be used to access
the object:
 files
 pipes
 mailslots
 communications resources
 disk devices(Windows NT only)
 consoles
 directories(open only)

CreateFile 函数创建或打开下列对象,并返回一个可以用来访问这些对象的句柄。 
  文件 
 pipes
  邮槽 
  通信资源 
  磁盘驱动器(仅适用于 windowsNT ) 
  控制台 
  文件夹(仅用于打开)

HANDLE CreateFile(
 LPCTSTR lpFileName,    // 指向文件名的指针 
 DWORD dwDesiredAccess,    // 访问模式(写 / 读) 
 DWORD dwShareMode,    // 共享模式 
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针 
 DWORD dwCreationDisposition,   // 如何创建 
 DWORD dwFlagsAndAttributes,   // 文件属性 
 HANDLE hTemplateFile    // 用于复制文件句柄 
);

Parametes
参数列表

参数

类型及说明

lpFileName

String ,要打开的文件的名字

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

关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

也可在 Windows NT 下组合使用下述常数标记:

SECURITY_ANONYMOUS , SECURITY_IDENTIFICATION , SECURITY_IMPERSONATION , SECURITY_DELEGATION ,SECURITY_CONTEXT_TRACKING , SECURITY_EFFECTIVE_ONLY

hTemplateFile

Long ,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

返回值

如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。即使函数成功,但若文件存在,且指定了 CREATE_ALWAYS 或 OPEN_ALWAYS , GetLastError 也会设为ERROR_ALREADY_EXISTS

lpFileName
 Pointer to a null-terminated string that specifies the name of the object(file, pipe, mailslot, 
 communications resource, disk device, console, or directory) to create or open.
  指向一个空结尾字符串。该参数指定了用于创建或打开句柄的对象。

 if *lpFileName is a path, there is a default string size limit of MAX_PATH characters, This limit is
 related to how the CreateFile function parses paths.
  如果 lpFileName 的对象是一个路径,则有一个最大字符数的限制。不能超过常量 (MAX_PATH). 这个限制指示了 
 CreateFile 函数如何解析路径 .

dwDesiredAccess
 Specifies the type of access to the object. An application can obtain read access, write access,
 read-write access, or device query access, This parameter can be any combination of the following
 values
  指定对象的访问方式 , 程序可以获得读访问权 , 写访问权 , 读写访问权或者是询问设备 ("device query") 访问权 .
  这个参数可以是下列值的任意组合 
 
 Value( 值 )  Meaning( 含义 )
 0   Specifies device query access to the object. An application can query device
    attributes without accessing the device.
     指定询问访问权 . 程序可以在不直接访问设备的情况下查询设备的属性 .

 GENERIC_READ  Specifies read access to the object, Data can be read from the file and the 
    file pointer can be moved. Combine with GENERIC_WRITE for read-write access.
     指定读访问权 . 可以从文件中读取数据 , 并且移动文件指针 . 可以和 GENERIC_WRITE 组合 
     成为 " 读写访问权 ".

 GENERIC_WRITE  specifies write access to the object. Data can be written to the file and the
    file pointer can be moved. Combine with GENERIC_READ fro read-write access
     指定写访问权 . 可以从文件中写入数据 , 并且移动文件指针 . 可以和 GENERIC_READ 组合 
     成为 " 读写访问权 ".

dwShareMode
 Set of bit flags that specifies how the object can be shared, If dwShareMode is 0, the object cannot
 be shared. Subsequent open operations on the object will fail, until the handle is closed.
  设置位标志指明对象如休共享 . 如果参数是 0, 对象不能够共享 . 后续的打开对象的操作将会失败 , 直到该对象的句 
  柄关闭 .

 To share the object, use a combination of one or more of the following values:
  使用一个或多个下列值的组合来共享一个对象 .
 Value( 值 )  Meaning( 含义 )
 FILE_SHARE_DELETE WindowsNT: Subsequent open operations on the object will succeed only if
    delete access is requested.
    WINDOWS NT: 后续的仅仅请求删除访问权的打开操作将会成功 .

 FILE_SHARE_READ  Subsequent open operations on the object will successd only if read access
    is requested.
     后续的仅仅请求读访问权的打开操作将会成功 .

 FILE_SHARE_WRITE Subsequent open operations on the object will succeed only if write access
    is requested.
     后续的仅仅请求写访问权的打开操作将会成功 .

lpSecurityAttributes
 pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be 
 inherited by child processes, if lpSecurityAttributes is NULL, the handle cannot be inherited.
  指向一个 SECURITY_ATTRIBUTES 结构的指针用于确定如何在子进程中继承这个句柄 . 如果这个参数是 NULL,
  则该句柄不可继承 .

dwCreationDisposition
 Specifies which action to take on files that exist, and which action to take when files do not exist.
 For more information about this parameter, see the remarks section. This parameter must be one of the
 following values
  指定当文件存在或者不存在时如何动作。关于这个参数更多的信息,参考批注部分。这个参数必须是一个或多个 
  下列值。

 VALUE( 值 )  Neaning( 含义 )
 CREATE_NEW  Creates a new file. The function fails if the specified file already exists
     创建一个新文件 . 如果该文件已经存在函数则会失败 .
 
 CREATE_ALWAYS  Creates a new file. If the file exsts, the function overwrites the file and
    clears the existing attributes.
     创建一个新文件 . 如果该文件已经存在 , 函数将覆盖已存在的文件并清除已存在的文件属性

 OPEN_EXISTING  Opens the file. The function fails if the file does not exist.
    See the Remarks section for a discussion of why you should use the 
    OPEN_EXISTING flag if you are using the CreateFile function for devices,
    including the console.
     打开一个文件 , 如果文件不存在函数将会失败 .
     如查你使用 CreateFile 函数为设备装载控制台 . 请查看批注中的 " 为什么使用 
    OPEN_EXISTING 标志 " 的部分 .
    
 OPEN_ALWAYS  Opens the file, if it exsts. If the file does not exist, the function creates
    the file as if dwCreationDisposition were CREATE_NEW.
     如果文件存在 , 打开文件 . 如果文件不存在 , 并且参数中有 CREATE_NEW 标志 , 则创建文件 .

 TRUNCATE_EXISTING Opens the file. Once opened, the file is truncated so that its size is zero 
    bytes The calling process must open the file with at least GENERIC_WRITE access.
    The function fails if the file does not exist.
     打开一个文件 , 每次打开 , 文件将被截至 0 字节 . 调用进程必须用 GENERIC_WRITE 访问模式打 
     开文件 . 如果文件不存在则函数就会失败 .

dwFlagsAndatributes
 Specifies the file attributes and flags for the file.
  为文件指定属性和标志位

 Any combination of the following attributes is acceptable for the dwFlagsAndAttributes parameter,
 except all other file attributes override FILE_ATTRIBUTE_NORMAL.
  该参数可以接收下列属性的任意组合 . 除非其它所有的文件属性忽略 FILE_ATTRIBUTE_NORMAL.
 Attribute( 属性 )   Meaning( 标志 )
 FILE_ATTRIBUTE_ARCHIVE  The ifle should be archived. Application use this attribute to mark
     files for backup or removal.
      文件将被存档 , 程序使用此属性来标志文件去备份或移除

 FILE_ATTRIBUTE_HIDDEN  The file is hidden. It is not to be included in an ordinary directory
     listing.
      文件被隐藏 , 它不会在一般文件夹列表中被装载 .

 FILE_ATTRIBUTE_NORMAL  The file has no other attributes set. This attribute is valid only if
     used alone
      文件没有被设置任何属性 .


 FILE_ATTRIBUTE_OFFLINE  The data of the file is not immediately available. Indicates that the
     file data has been physically moved to offline storage.
      文件的数据没有被立即用到。指出正在脱机使用该文件。

 FILE_ATTRIBUTE_READONLY  The file is read only.Applications can read the file but cannot write
     to it or delete it
      这个文件只可读取 . 程序可以读文件 , 但不可以在上面写入内容 , 也不可删除 .

 FILE_ATTRIBUTE_SYSTEM  The file is part of or is used exclusively by the operation system.
      文件是系统的一部分 , 或是系统专用的 .

 FILE_ATTRIBUTE_TEMPORARY The file is being used for temporary storage. File systems attempt
     to keep all of the data in memory for quicker access rather than 
     flushing the data back to mass storage. A temporary file should be 
     deleted by the application as soon as it is no longer needed.
      文件被使用后,文件系统将努力为(文件的)所有数据的迅迅访问保持一块 
      内存。临时文件应当在程序不用时及时删除。

 Any combination of the following flags is acceptable for the dwFlagsAndAttributes parameter.
 dwFlagAndAttributes 可以接受下列标志的任意组合。

 FLAG (标志)    Meaning( 含义 )
 FILE_FLAG_WRITE_THROUGH  Instructs the system to write through any intermediate cache and go
     directly to disk. The system can still cache write operations, but
     cannot lazily flush them.
      指示系统通过快速缓存直接写入磁盘,

 FILE_FLAG_OVERLAPPED  Instructs the system to initialize the object, so that operations that
     take a significant amount of time to process return ERROR_IO_PENDING.
     When the operation is finished, the specified event is set to the 
     signaled state.
      指示系统初始化对象 , 此操作将对进程设置一个引用计数并返回 ERROR_IO_PENDING.
      处理完成后 , 指定对象将被设置为信号状态 .

     When you specify FILE_FLAG_OVERLAPPED, the file read and write functions
     must specify an OVERLAPPED structure. That is, when FILE_FLAG_OVERLAPPED
     is specified, an application must perform overlapped parameter(pointing
     to an OVERLAPPED structure)to the file read and write functions.
     This flag also enables more than one operation to be performed
     simultaneously with the handle(a simultaneous read and write operation,
     for example).
      当你指定 FILE_FLAG_OVERLAPPED 时 , 读写文件的函数必须指定一个 OVERLAPPED 结构 .
      并且 . 当 FILE_FLAG_OVERLAPPED 被指定 , 程序必须执行重叠参数 ( 指向 OVERLAPPED
      结构 ) 去进行文件的读写 .
      这个标志也可以有超过一个操作去执行 .

 FILE_FLAG_NO_BUFFERING  Instructs the system to open the file with no intermediate buffering or
     caching.When combined with FILE_FLAG_OVERLAPPED, the flag gives maximum
     asynchronous performance, because the I/O does not rely on the synchronous
     operations of the memory manager. However, some I/O operations will take
     longer, because data is not being held in the cache.
      指示系统不使用快速缓冲区或缓存,当和 FILE_FLAG_OVERLAPPED 组合 , 该标志给出最 
      大的异步操作量 , 因为 I/O 不依赖内存管理器的异步操作 . 然而 , 一些 I/O 操作将会运行 
      得长一些 , 因为数据没有控制在缓存中 .

     An application must meet certain requirements when working with files 
     opened with FILE_FLAG_NO_BUFFERING:
      当使用 FILE_FLAG_NO_BUFFERING 打开文件进行工作时 , 程序必须达到下列要求 :
     
      File access must begin at byte offsets within the file that are 
      integer multiples of the volume's sector size.
       文件的存取开头的字节偏移量必须是扇区尺寸的整倍数 .
      
      File access must be for numbers of bytes that are integer 
      multiples of the volume's sector size. For example, if the sector
      size is 512 bytes, an application can request reads and writes of
      512, 1024, or 2048 bytes, but not of 335, 981, or 7171bytes.
       文件存取的字节数必须是扇区尺寸的整倍数 . 例如 , 如果扇区尺寸是 512 字节 
       程序就可以读或者写 512,1024 或者 2048 字节 , 但不能够是 335,981 或者 7171
       字节 .

      buffer addresses for read and write operations must be sector
      aligned(aligned on addresses in memory that are integer multiples
      of the volume's sector size).
       进行读和写操作的地址必须在扇区的对齐位置 , 在内存中对齐的地址是扇区 
       尺寸的整倍数 .

     One way to align buffers on integer multiples of the volume sector size is
     to use VirtualAlloc to allocate the buffers, It allocates memory that is 
     aligned on addresses that are integer multiples of the operating system's
     memory page size. Because both memory page and volume sector sizes are 
     powers of 2, this memory is also aligned on addresses that are integer 
     multiples of a volume's sector size.
      一个将缓冲区与扇区尺寸对齐的途径是使用 VirtualAlloc 函数 . 它分配与操作系统 
      内存页大小的整倍数对齐的内存地址 . 因为内存页尺寸和扇区尺寸 --2 都是它们的幂 .
      这块内存在地址中同样与扇区尺寸大小的整倍数对齐 .

     An application can determine a volume's sector size by calling the 
     GetDiskFreeSpace function
      程序可以通过调用 GetDiskFreeSpace 来确定扇区的尺寸 .

 FILE_FLAG_RANDOM_ACCESS
     Indicates that the file is accessed randomly. The system can use this as
     a hint to optimize file caching.
      指定文件是随机访问 , 这个标志可以使系统优化文件的缓冲 .


 FILE_FLAG_SEQUENTIAL_SCAN 
     Indicates that the file is to be accessed sequentially from beginning to 
     end. The system can use this as a hint to optimize file caching. If an 
     application moves the file pointer for random access, optimum caching may
     not occur; however, correct operation is still guaranteed.
      指定文件将从头到尾连续地访问 . 这个标志可以提示系统优化文件缓冲 . 如果程序在 
      随机访问文件中移动文件指针 , 优化可能不会发生 ; 然而 , 正确的操作仍然可以得到保 
      证 
     
     Specifying this flag can increase performance for applications that read
     large files using sequential access, performance gains can be even more
     noticeable for applications that read large files mostly sequentially,
     but occasionally skip over small ranges of bytes.
      指定这个标志可以提高程序以顺序访问模式读取大文件的性能 , 性能的提高在许多 
      程序读取一些大的顺序文件时是异常明显的 . 但是可能会有小范围的字节遗漏 .


 FILE_FLAG_DELETE_ON_CLOSE Indicates that the operating system is to delete the file immediately 
     after all of its handles have been closed, not just the handle for which
     you specified FILE_FLAG_DELETE_ON_CLOSE.
      指示系统在文件所有打开的句柄关闭后立即删除文件 . 不只有你可以指定 FILE_FLAG_DELETE_ON_CLOSE
     
     Subsequent open requests for the file will fail, unless FILE_SHARE_DELETE
     is used.
      如果没有使用 FILE_SHARE_DELETE, 后续的打开文件的请求将会失败 .

 FILE_FLAG_BACKUP_SEMANTICS  WINDOWS NT:Indicates that the file is being opened or created for a backup
     or restore operation.The system ensures that the calling process overrides
     file security checks, provided it has the necessary privileges. The 
     relevant privileges are SE_BACKUP_NAME and SE_RESTORE_NAME.
     WINDOWS NT: 指示系统为文件的打开或创建执行一个备份或恢复操作 . 系统保证调 
      用进程忽略文件的安全选项 , 倘若它必须有一个特权 . 则相关的特权则是 SE_BACKUP_NAME
      和 SE_RESTORE_NAME.

     You can also set this flag to obtain a handle to a directory. A directory
     handle can be passed to some Win32 functions in place of a file handle.
      你也可以使用这个标志获得一个文件夹的句柄,一个文件夹句柄能够象一个文件句柄 
      一样传给某些 Win32 函数。

 FILE_FLAG_POSIX_SEMANTICS Indicates that the file is to be accessed according to POSIX rules. This
     includes allowing multiple files with names, differing only in case, for file
     systems that support such naming. Use care when using this option because
     files created with this flag may not be accessible by applications written
     for MS-DOS or 16-bit Windows.
      指明文件符合 POSIX 标准 . 这是在 MS-DOS 与 16 位 Windows 下的标准 .

 FILE_FLAG_OPEN_REPARSE_POINT Specifying this flag inhibits the reparse behavior of NTFS reparse points.
     When the file is opened, a file handle is returned, whether the filter that
     controls the reparse point is operational or not. This flag cannot be used
     with the CREATE_ALWAYS flag.
      指定这个标志制约 NTFS 分区指针 . 该标志不能够和 CREAT_ALWAYS 一起使用 .

 FILE_FLAG_OPEN_NO_RECALL Indicates that the file data is requested,but it should continue to reside in
     remote storage. It should not be transported back to local storage. This flag
     is intended for use by remote storage systems or the Hierarchical Storage
     Management system.
      指明需要文件数据 , 但是将继续从远程存储器中接收 . 它不会将数据存放在本地存储器中 .
      这个标志由远程存储系统或等级存储管理器系统使用 .

hTemplateFile
 Specifies a handle with GENERIC_READ access to a template file. The template file supplies file attributes and
 extended attributes for the file being created.
  为 GENERIC_READ 访问的模式指定一个句柄到模板文件 . 模板文件在文件开始创建后提供文件属性和扩展属性 .

Return Values
返回值

If the function succeeds, the return value is an open handle to the specified file. If the specified file exists before
the function call and dwCreation is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS
(even though the function has succeeded). If the file does not exist before the call, GetLastError returns zero.
如果函数成功 , 返回一个打开的指定文件的句柄 . 如果指定文件在函数调用前已经存在并且 dwCreation 参数是 CREATE_ALWAYS 或者 
OPEN_ALWAYS, 调用 GetLastError 就会返回 ERROR_ALREADY_EXISTS( 表示函数成功 ). 如果函数文件在调用前不存在则会返回 0.

 

If the function fails, the return value is INVALID_HANDLE_VALUE.To get extended error information, call GetLastError.如果函数失败 , 返会值会是 INVALID_HANDLE_VALUE. 更多的错误信息可以调用 GetLastError 来获得 .

 

 

 

 

一、*****CreateFile*****
    这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:
控制台对象、通信资源对象、目录对象(只能打开)、磁盘设备对象、文件对象、邮槽对象、管道对象。
    函数原型:
HANDLE CreateFile(
LPCTSTR lpFileName,                         // file name对象路径名
DWORD dwDesiredAccess,                      // access mode控制模式
DWORD dwShareMode,                          // share mode共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD 安全属性(也即销毁方式)
DWORD dwCreationDisposition,                // how to create
DWORD dwFlagsAndAttributes,                 // file attributes
HANDLE hTemplateFile                        // handle to template file
);
【Parameters】
1、lpFileName
    一个指向无终结符的字符串的指针,来指明要创建或打开的对象的名字。
    在Windows NT/2000/XP平台上:如果用ANSI版本的函数,字符串长度应限制在MAX_PATH;如果用Unicode版本的函数,这个限制可以扩充到32000个Unicode字符。
    在Windows95/98/Me平台上:只能用ANSI版本的函数,字符串长度限制在MAX_PATH。
2、dwDesiredAccess
    指明对象的控制模式。一个应用程序可以包含读控制、写控制、读/写控制、设备查询控制。
这个参数的取值可以是下面这些的组合:
    0                                             指定设备查询控制:程序可以不访问设备就查询到设备属性。
    GENERIC_READ                指定读控制,可以从对象中读取数据(指针将可以移动)。
    GENERIC_WRITE               指定写控制,可以向对象中写数据(指针将可以移动)。
    ----------------------------------------------------------------------
    另外,还可以指定下面的控制标志:
标准控制权限(16-23位掩码):
    DELETE                     删除对象的权限。
    READ_CONTROL    从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。
    WRITE_DAC              修改对象安全描述符中的DACL(随机访问控制列表)的权限
    WRITE_OWNER      修改对象安全描述符中的属主的权限
    SYNCHRONIZE     同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。
    STANDARD_RIGHTS_REQUIRED    等价于前面四种权限的总合(通常这四种是必须具有的权限)。
    STANDARD_RIGHTS_READ        一般等价于READ_CONTROL
    STANDARD_RIGHTS_WRITE       一般等价于READ_CONTROL
    STANDARD_RIGHTS_EXECUTE     一般等价于READ_CONTROL
    STANDARD_RIGHTS_ALL         等价于前面五种权限的总合。
特殊控制权限(0-15位掩码):
    SPECIFIC_RIGHTS_ALL
    ACCESS_SYSTEM_SECURITY
    MAXIMUM_ALLOWED
    GENERIC_READ
    GENERIC_WRITE
    GENERIC_EXECUTE
    GENERIC_ALL 
注:实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。
3、dwShareMode
    指定对象的共享模式。如果dwShareMode==0,表示是互斥使用的。如果CreateFile打开成功,则别的程序只能等到当前程序关闭对象句柄CloseHandle后才能在打开或使用。
    使用下面这些值的组合来表示对象的共享模式:
    FILE_SHARE_DELETE       Windows NT/2000/XP:打开操作只有在删除请求发生时才能返回成功。
    FILE_SHARE_READ                 打开操作只有在读控制请求发生时才能返回成功。
    FILE_SHARE_WRITE                打开操作只有在写控制请求发生时才能返回成功。
4、lpSecurityAttributes
    一个指向SECURITY_ATTRIBUTES结构对象的指针,决定返回的句柄是否被子进程所继承。如果lpSecurityAttributes参数为NULL,句柄就不能被子进程继承。
    在Windows NT/2000/XP平台下:lpSecurityDescriptor这个成员指明了这个对象的安全描述符。如果 lpSecurityAttributes参数为NULL,对象将获得一个默认的安全描述符。目标文件系统必须为这个参数的在文件上的有效操作保证安全 性。
typedef struct _SECURITY_ATTRIBUTES { 
DWORD nLength; //结构体的大小(字节为单位),即siziof(SECURITY_ATTRIBUTES)
LPVOID lpSecurityDescriptor; //指向对象的安全描述符的指针,控制对象的共享属性。在Windows 95/98/Me平台                                                     //上这个成员被忽略。
BOOL   bInheritHandle; //指明当一个新的子进程创建时,是否继承当前返回的句柄
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;
5、dwCreationDisposition
    指明当打开的对象存在或不存在的时候各需怎样处理。这个参数必须是一下值的其中之一:
    CREATE_NEW            创建新文件/对象(当对象已经存在是将返回失败)。
    CREATE_ALWAYS         总是创建(如果对象存在就覆盖它,清除当前属性,把文件属性和dwFlagsAndAttributes指定的标志相结合)。
    OPEN_EXISTING         打开文件(如果不存在就返回失败)。
    OPEN_ALWAYS      存在就打开;若不存在,假如dwCreationDisposition==CREATE_NEW就创建一个新文件。
    TRUNCATE_EXISTING     存在就打开,且清空文件内容(至少要有GENERIC_WRITE权限);若文件不存在就返回失败。
6、dwFlagsAndAttributes
    指定文件属性和标志。可以是以下值的任意组合(只有FILE_ATTRIBUTE_NORMAL必须单独使用,唯一例外):
Attribute:
    FILE_ATTRIBUTE_ARCHIVE                 文件存档(备份或移动时会对文件做标记)。
    FILE_ATTRIBUTE_ENCRYPTED               加密(对文件来说是内容加密,对目录来说是对将来新建的文件默认为加密属性),与此同时,如果还设置了FILE_ATTRIBUTE_SYSTEM属性,当前这个属性将无效。
    FILE_ATTRIBUTE_HIDDEN                  隐藏属性。
    FILE_ATTRIBUTE_NORMAL                  文件没有其他属性设置,此属性只能单独使用才合法。
    FILE_ATTRIBUTE_NOT_CONTENT_INDEXED     不建立内容索引。
    FILE_ATTRIBUTE_OFFLINE                 脱机属性。文件内容暂时不可用。此属性被Remote Storage软件所用,不能任意更改。
    FILE_ATTRIBUTE_READONLY                只读文件属性。应用程序不能写或删除。
    FILE_ATTRIBUTE_SYSTEM                  文件是系统文件或被操作系统互斥地使用。
    FILE_ATTRIBUTE_TEMPORARY               临时文件,使用过程中尽量留在内存以保证存取速度。
Flag:
    FILE_FLAG_WRITE_THROUGH            指示系统立即写磁盘。这个写操作允许被cache缓存,但不能被搁置。
    FILE_FLAG_OVERLAPPED                   指示系统初始化对象,如果操作需要大量时间执行就先返回一 个 ERROR_IO_PENDING,当操作 完成后再通过事件使能信号量。指定这个标志就必须在read和write函数里初始化OVERLAPPED 结构体,应用程序必须执行重复的读写操作。此时,操作系统不维护文件指针,当前的位置   需要通过OVERLAPPED的指针传递给读写函数。这个标志还允许多个操作的并行(并行读写)。
    FILE_FLAG_NO_BUFFERING                 指示系统不要缓冲,它如果和FILE_FLAG_OVERLAPPED联合使用,将呈现最好的异步性能,因为I/O操作并不依赖于内存管理器的同步性。但 是有时I/O操作会慢些,因为没用cache。有时程序需要做调整,比如文件大小必须是扇区大小的整数倍,Buffer地址的按扇区地址对齐等。按扇区地 址对齐内存边界可以使用VirtualAlloc来分配内存,GerDiskFreeSpace函数可以得到磁盘一个扇区的大小。
    FILE_FLAG_RANDOM_ACCESS                指示文件进行随即存取,系统可据此对cache的分配进行优化。
    FILE_FLAG_SEQUENTIAL_SCAN              指示顺序存取,系统也可据此对cache的分配进行优化。即使有随即存取的操作,也不会出错,不过cache的优化就取消了。在连续读取大文件时性能非常好。
    FILE_FLAG_DELETE_ON_CLOSE              指示系统在句柄关闭时将响应的文件立即删除,对当前句柄以外的其他句柄也有效。而且随后的打开请求也会失败,直到你使用了FILE_SHARE_DELETE属性。
    FILE_FLAG_BACKUP_SEMANTICS             在Windows NT/2000/XP平台上:指示文件作为备份或恢复文件打开,这是如果调用进程拥有特殊权限(SE_BACKUP_NAME 或 SE_RESTORE_NAME),就可以不进行安全检查。也可以在获得一个目录的句柄时设置这个flag,目录句柄可以代替文件句柄传递给一些函数。
    FILE_FLAG_POSIX_SEMANTICS              指明按照操作系统接口规范进行文件存取,这包括允许多文件名的使用。请谨慎使用,因为MS_DOS或16位Windows系统可能不支持。
    FILE_FLAG_OPEN_REPARSE_POINT           这个标志指明禁止文件系统的重解析点的动作。文件打开时就返回文件的句柄,而不在乎控制重解析点的过滤器是否可运行。不能和CREATE_ALWAYS同时使用。
    FILE_FLAG_OPEN_NO_RECALL               表明文件数据被请求,但仍然驻留在远程存储体中,而不会被传回本地存储体。这个标志 由远程存储系统或分层存储管理系统使用。
    如果CreateFile函数打开一个命名管道的客户端,dwFlagsAndAttributes 参数也会包含服务信息的安全性。当调用程序指定了
SECURITY_PRESENT标志时,dwFlagsAndAttributes 参数可以取以下一个或多个值:
    SECURITY_ANONYMOUS                  指定将客户端模拟在匿名级别(the Anonymous impersonation level)
    SECURITY_IDENTIFICATION             指定将客户端模拟在身份认证级别(the Identification impersonation level)
    SECURITY_IMPERSONATION              指定将客户端模拟在伪装级别(the Impersonation impersonation level)
    SECURITY_DELEGATION                 指定将客户端模拟在授权级别(the Delegation impersonation level)
    SECURITY_CONTEXT_TRACKING           指定安全跟踪模式是动态的,否则(不指定此标志)是静态的
    SECURITY_EFFECTIVE_ONLY             指定客户端的安全内容中的有效内容才可以被服务端使用,否则所有内容都可被使用。 这个标志允许客户端限制服务端在模拟客户端时所具有的权限。
7、hTemplateFile
    把具有GENERIC_READ权限的句柄指定为一个模板文件。这个模板文件提供了文件属性和扩展属性,用于创建文件。在Windows95/98/Me 平台上:这个参数必须为空,否则如果你提供一个句柄,函数调用将会失败,用GerLastError函数获得的出错信息为 ERROR_NOT_SUPPORTED。

【Return Values】
    调用如果成功,返回值时一个打开文件的句柄。
    如果调用之前文件已存在,且dwCreationDisposetion 为CREATE_ALWAYS或OPEN_ALWAYS,用GetLastError返回ERROR_ALREADY_EXISTS。
(即使调用成功也会返回这个值)。如果调用之前不存在,GetLastError返回0。
    调用如果失败,返回值是INVALID_HANDLE_VALUE。要进一步了解出错原因,调用GetLastError。
    
【Remarks】
    在Windows 2000/XP平台上:
    如果你企图打开一个远程机器上的文件或目录,dwDesiredAccess设置为DELETE或者任一其他的控制标志,
而这时远程文件或目录还没有以FILE_SHARE_DELETE的方式打开的话,你的函数调用就会发生共享错误了。
为了避免共享错误,一种办法是单独用DELETE方式打开远程文件或目录,另一种方法是在打开文件或目录之前先调用DeleteFile函数。
    如果dwCreationDisposition 参数指定为CREATE_ALWAYS 并且dwFlagsAndAttributes 参数指定为FILE_ATTRIBUTE_NORMAL 的话,CreateFile调用将失败,GetLastError报告的错误是ACCESS_DENIED。这时,把 dwFlagsAndAttributes 参数设置为FILE_ATTRIBUTE_HIDDEN和FILE_ATTRIBUTE_NORMAL的联合值,将避免这个问题。

二、*****CloseHandle*****
    用于关掉一个打开的对象句柄。
    函数原型:
BOOL CloseHandle(
HANDLE hObject   // handle to object
);
【Return Values】
    函数调用成功返回非零,失败返回0。获得更多错误信息,需要调用GetLastError函数。
    在Windows NT/2000/XP平台上:当应用程序在调试器下运行时,关闭一个不合法的句柄将产生一个异常(Exception)。包括两次关闭同一个句柄,或者试图关闭一个由FindFirstFile函数返回的句柄,都会产生异常。

【Remarks】
    CloseHandle使指定的句柄无效,减少对象的句柄计数,进行对象保持检验。当对象的最后一个句柄关闭时,对象将从系统中删除。关闭一个线程句柄并 不会终止一个线程,要释放一个线程对象,必须terminate线程,然后关闭所有的线程句柄。用CloseHandle只能关闭由CreateFile 函数返回的句柄。用FindClose来关闭由FindFirstFile返回的句柄。

三、*****ReadFile*****
    ReadFile函数从文件指针指定的位置读取数据。读操作完成后,文件指针将根据实际读出的数据自动进行调整,除非文件句柄是以OVERLAPPED属性值打开的。如果是以OVERLAPPED打开的I/O,应用程序就需要自己手动调整文件指针。
    这个函数被设计成兼有同步和异步操作。ReadFileEx函数则设计成只支持异步操作,异步操作允许应用程序在读文件期间可以同时进行其他的操作。
    函数原型:
BOOL ReadFile(
HANDLE hFile,                // handle to file
LPVOID lpBuffer,             // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped    // overlapped buffer
);

【Parameters】
1、hFile
    文件句柄(必须具有GENERIC_READ访问权限)。
    在Windows NT/2000/XP平台上:对于异步读操作,hFile可以是由CreateFile函数以FILE_FLAG_OVERLAPPED方式打开的任何句柄,或者一个由socket或accept函数返回的socket句柄。
    在Windows 95/98/Me平台上:对于邮槽、命名管道和磁盘文件不能使用异步读操作。 
2、lpBuffer
    用来接收从文件中读出的数据的缓冲区指针。
3、nNumberOfBytesToRead
    指明要读的字节总数。
4、lpNumberOfBytesRead
    一个变量指针,用来存储实际传输的字节总数。ReadFile在做所有事情(包括错误检查)之前,先将这个值赋为0。当ReadFile从一个命名管道上 返回TRUE时这个参数为0,说明消息管道另一端调用WriteFile时设置的nNumberOfBytesToWrite 参数为0。
    在Windows NT/2000/XP平台上:如果lpOverlapped 为NULL,则lpNumberOfBytesRead不能为NULL。如果lpOverlapped 不是NULL,lpNumberOfBytesRead可以设为NULL。如果是一个overlapped形式的读操作,我们可以动用 GetOverlappedResult函数来获得传输的实际字节数。如果hFile关联的是一个完成端口(I/O completion port),那么可以调用GetQueuedCompletionStatus函数来获得传输的实际字节数。
    如果完成端口(I/O completion port)被占用,而你用的是一个用于释放内存的回调例程,对于lpOverlapped参数指向的OVERLAPPED结构体来说,为这个参数指定 NULL可以避免重新分配内存时发生内存泄漏。内存泄漏会导致返回这个参数值时是一个非法值。
    Windows 95/98/Me平台上:这个参数不允许为NULL。
5、lpOverlapped
    一个指向OVERLAPPED结构体的指针。如果hFile是以FILE_FLAG_OVERLAPPED方式获得的句柄,这个结构是必须的,不能为 NULL。(否则函数会在错误的时刻报告读操作已经完成了)。这时,读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,并且在实际 完成读操作之前就返回了。在这种情况下,ReadFile返回FALSE,GerLastError报告从错误类型是ERROR_IO_PENDING。 这允许调用进程继续其他工作直到读操作完成。OVERLAPPED结构中的事件将会在读操作完成时被使能。
    如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped为NULL,读操作就从当前文件的开始位置读起,直到读操作完成ReadFile函数才能返回。
    在Windows NT/2000/XP平台上:如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped不为 NULL,则读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,直到读操作完成ReadFile函数才能返回。
    在Windows 95/98/Me平台上:对于文件、磁盘、管道和邮槽的操作,这个参数必须为NULL。一个不为空的OVERLAPPED结构体指针将导致调用失败。Windows 95/98/Me平台只支持串行口和并行口的overlapped 读写。

【Return Values】
    有如下任一种情况发生都会导致函数返回:(1)在管道另一端的写操作完成后(2)请求的字节数传输完毕(3)发生错误。
    如果函数正确,返回非零。
    如果返回值是非零,但接收的字节数是0,那么可能是文件指针在读操作期间超出了文件的end位置。然而,如果文件以 FILE_FLAG_OVERLAPPED方式打开,lpOverlapped 参数不为NULL,文件指针在读操作期间超出了文件的end位置,那么返回值肯定是FALSE,GetLastError返回的错误是 ERROR_HANDLE_EOF。

【Remarks】
    如果文件的一部分被另一个进程锁定,而当前进程试图重复锁定,那将会失败。
    一个应用程序在读以FILE_FLAG_NO_BUFFERING方式打开的文件时要符合一定的条件。
(1)文件读的开始地址必须是扇区大小的整数倍。GetDiskFreeSpace函数可以取得扇区的大小。
(2)请求读的字节数也必须是扇区大小的整数倍。
(3)用于读写操作的Buffer地址必须按照扇区大小进行边界对齐。可以通过用VirtualAlloc 函数申请内存来做到。
    在读操作期间试图访问相应的输入缓冲区,会导致读入到缓冲区的数据损坏。读操作完成之前,应用程序不能对这段输入缓冲区做任何操作(包括读、写、重新分配内存,释放内存等)。
    ReadFile可以通过指向控制台输入对象的句柄将控制台的输入字符读出来。控制台的模式决定了ReadFile的具体行为。
    如果一个命名管道正在以消息模式被读取,并且下一条消息比nNumberOfBytesToRead参数指定的长度还大,那么ReadFile将返回 FALSE并且GetLastError返回错误为ERROR_MORE_DATA。剩下没读完的消息可能会被随后的ReadFile或 PeckNamedPipe函数读出。
    读取一个通信设备时,ReadFile的行为被当前的通信延时所支配,延时属性的设置和取得使用SetCommTimeouts和GetCommTimeouts函数。如果你设置延时属性失败,就会得到不可预知的结果。
    如果ReadFile试图读取一个buffer太小的邮槽,将会返回FALSE并且GetLastError返回错误为ERROR_INSUFFICIENT_BUFFER 。
    如果一个匿名的写管道句柄已经关闭,而ReadFile试图用响应的匿名权限读这个管道句柄,将返回FALSE并且
GetLastError返回错误为ERROR_BROKEN_PIPE。
    每当有太多的异步I/O请求得不到响应,ReadFile就会失败,并返回ERROR_INVALID_USER_BUFFER或ERROR_NOT_ENOUGH_MEMORY的错误。
    在同步和异步两种情况下,ReadFile中检测EOF(文件结尾边界)的代码是不同的。当一个同步读操作到达文件结尾时,ReadFile返回 TRUE,并设置*lpNumberOfBytesRead 为0 。异步读操作会在开始调用的读操作中或者随后的其他异步操作中突然遇到文件结尾。(1)如果EOF在ReadFile期间被检测到,将会返回FALSE, 且 GetLastError返回错误描述 ERROR_HANDLE_EOF。(2)如果EOF在随后的其他异步操作中被检测到,则类似GetOverlappedResult 等试图获取操作结果的函数返回FALSE,且 GetLastError返回错误描述ERROR_HANDLE_EOF。
    为了取消未响应的异步I/O操作,用CancelIo函数。这个函数只能取消由调用进程对特定句柄进行的操作。被取消的I/O操作将被描述为ERROR_OPERATION_ABORTED。
    如果你正试图从并不存在的软驱中读数据,系统会弹出消息框提示你重新操作。为了阻止系统的消息框,调用函数SetErrorMode,参数设置为SEM_NOOPENFILEERRORBOX。

四、*****WriteFile*****
    可以以同步或异步方式向一个对象句柄中写数据
    函数原型:
BOOL WriteFile(
HANDLE hFile,                    // handle to file
LPCVOID lpBuffer,                // data buffer
DWORD nNumberOfBytesToWrite,     // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // number of bytes written
LPOVERLAPPED lpOverlapped        // overlapped buffer
);

其他信息与ReadFile极其相似,可参考上文ReadFile的翻译。

五、*****DeviceIoControl*****
    这个函数直接向指定的设备驱动程序发送控制码,使响应的设备产生响应的操作。
    函数原型:
BOOL DeviceIoControl(
HANDLE hDevice,              // handle to device
DWORD dwIoControlCode,       // operation
LPVOID lpInBuffer,           // input data buffer
DWORD nInBufferSize,         // size of input data buffer
LPVOID lpOutBuffer,          // output data buffer
DWORD nOutBufferSize,        // size of output data buffer
LPDWORD lpBytesReturned,     // byte count
LPOVERLAPPED lpOverlapped    // overlapped information
);

【Parameters】
(1)hDevice(输入)
    用CreateFile获得的设备句柄,典型的设备对象有卷、目录、文件、交替的流等。
(2)dwIoControlCode(输入)
    指定操作码。这个值区别特定的操作和设备对象的类型。
    IOCTL_DISK_CREATE_DISK                用特定的信息初始化指定的磁盘和磁盘分区表
    IOCTL_DISK_FORMAT_TRACKS              格式化一组连续的磁道
    IOCTL_DISK_GET_DRIVE_GEOMETRY         获取关于物理磁盘几何属性的信息
    IOCTL_DISK_GET_DRIVE_GEOMETRY_EX      获取关于物理磁盘几何属性的信息
    IOCTL_DISK_GET_DRIVE_LAYOUT_EX        获取一个磁盘的分区数量和每个分区的特征信息
    IOCTL_DISK_GET_LENGTH_INFO            获得指定磁盘、卷、分区的长度
    IOCTL_DISK_GET_PARTITION_INFO_EX      获取自动变速(AT)分区和可扩展固件接口(EFI)分区的分区信息
    IOCTL_DISK_PERFORMANCE                提供磁盘性能信息 
    IOCTL_DISK_REASSIGN_BLOCKS            将磁盘块映射到空闲块池
    IOCTL_DISK_SET_DRIVE_LAYOUT_EX        将磁盘分区
    IOCTL_DISK_SET_PARTITION_INFO_EX      设置分区类型
    IOCTL_DISK_UPDATE_PROPERTIES          使特定磁盘的cache分区表无效并重新枚举磁盘
    IOCTL_DISK_VERIFY                     对磁盘大小进行逻辑检测
    IOCTL_SERIAL_LSRMST_INSERT            (不)使电话线和Modem的连接状态信息发送到数据流中
    IOCTL_STORAGE_CHECK_VERIFY            检测可移动媒体设备的改变
    IOCTL_STORAGE_EJECT_MEDIA             弹出SCSI设备中的媒体(比如光盘)
    IOCTL_STORAGE_GET_HOTPLUG_INFO        获取指定设备的热插拔配置
    IOCTL_STORAGE_GET_MEDIA_TYPES         获取媒体支持信息
    IOCTL_STORAGE_LOAD_MEDIA              将媒体装入设备
    IOCTL_STORAGE_MEDIA_REMOVAL           (不)使能媒体弹出装置
    IOCTL_STORAGE_SET_HOTPLUG_INFO        设置指定设备的热插拔配置
    IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS 获取一个或多个磁盘上指定卷的物理单元
    IOCTL_VOLUME_IS_CLUSTERED             决定是否为一个卷作索引

(3)lpInBuffer(输入)
    一个指针,指向存放操作所需数据的缓冲区。如果dwIoControlCode指定一个不需要输入数据的操作,那么这个参数可以为NULL。
(4)nInBufferSize(输入)
    以字节为单位,指定输入缓冲区的大小。
(5)lpOutBuffer(输出)
    一个指针,指向用来存放输出数据的缓冲区。如果dwIoControlCode指定一个没有输出数据的操作,那么这个参数可以为NULL。
(6)nOutBufferSize(输入)
    以字节为单位,指定输出缓冲区的大小。
(7)lpBytesReturned(输出)
    一个指针,指向一个存放输出数据长度的变量。
    如果输出缓冲区太小不足以接收任何数据,那么函数调用失败,GetLastError错误描述为ERROR_INSUFFICIENT_BUFFER,输出数据长度为0。
    如果输出缓冲区太小不足以接收所有数据但是可以放一部分,那么操作系统就返回可以放下的那部分数据,函数调用失败,
GetLastError错误描述为ERROR_MORE_DATA,输出数据长度是返回来的那部分数据的长度。你的应用程序应该调用DeviceIoControl 进行相同的操作,重新传输(指定那个没传完的地方作为开始点进行续传)。
    如果lpOverlapped 为NULL,那么lpBytesReturned 决不能为NULL。即使是一个没有输出数据的操作,lpOutBuffer为NULL,DeviceIoControl也将会用到 lpBytesReturned指向的那个变量。这样的操作返回后,这个参数的返回值是无意义的。
    如果lpOverlapped 不为NULL,那么lpBytesReturned 可以为NULL。如果是一次异步操作,我们可以通道函数GetOverlappedResult来获得返回的数据长度。如果hDevice 指向的是一个完成端口对象,我们可以用函数GetQueuedCompletionStatus获得返回数据的长度。
(8)lpOverlapped
    一个指向OVERLAPPED结构体的指针。
    如果hDevice用FILE_FLAG_OVERLAPPED 形式打开,lpOverlapped 必须指向一个合法的OVERLAPPED结构体。在这种情况下,进行异步操作。
    如果hDevice用FILE_FLAG_OVERLAPPED 形式打开,而lpOverlapped为NULL,函数会返回不可预知的错误。
    如果hDevice打开时没有指定FILE_FLAG_OVERLAPPED 标志,lpOverlapped参数将被忽略,进行同步操作,函数直到操作完成或出现错误时才返回。

【Parameters】
    成功返回非零,失败返回0,错误描述用GetLastError取得。

【Remarks】
    如果hDevice用FILE_FLAG_OVERLAPPED 形式打开,lpOverlapped 指向一个合法的OVERLAPPED结构体,这是进行异步操作。在这种情况下,OVERLAPPED结构体必须包含一个手动设置的事件对象(用 CreateEvent函数创建)。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值