文件操作编程之文件读写

来源:互联网 发布:淘宝客链接转换php 编辑:程序博客网 时间:2024/05/17 23:12

文件读写

微软提供了强大的文件读写(文件I/O)操作的编程接口,我们可以通过调用API函数的方式来实现文件的读写。一般情况下,文件的读写过程如图所示:

Created with Raphaël 2.1.0调用CreateFile函数打开或创建文件,返回文件句柄利用文件句柄调用WriteFile或者ReadFile函数写入或读取文件调用closeHandle函数关闭文件句柄

CreateFile函数

该函数的具体定义格式如下:

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

其中各个函数的具体要求如下:

  • lpFileName:要打开的文件名称
  • dwDesiredAccess:如为 GENERIC_READ 表示允许对设备进行读访问;如为 GENERIC_WRITE 表示允许对设备进行写操作(可组合使用);如为0,表示只允许获取与一个设备有关的信息。
  • dwShareMode : 该参数的作用是定义共享模式。其值为0表示不共享;而为FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享访问。
  • lpSecurityAttributes :指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果系统支持)。
  • dwCreationDisposition : 指定当文件存在或不存在时的操作,常见的操作有如下5种:
    1. CREATE_NEW : 创建文件,如文件存在,则会出错。
    2. CREATE_ALWAYS:创建文件,会改下前一个文件。
    3. OPEN_EXCITING : 文件必须已经存在,由设备提出要求。
    4. OPEN_ALWAYS : 如文件不存在,则创建它。
    5. TRUNCATE_EXCITING : 将现有文件的长度缩短为零。
  • dwFlagsAndAttributes :表示新创建文件的属性,文件常见的属性有以下五种:
    1. FILE_ATTRIBUTE_ARCHIVE:表示归档属性。
    2. FILE_ATTRIBUTE_NORMAL:默认属性。
    3. FILE_ATTRIBUTE_HIDDEN : 隐藏文件或目录。
    4. FILE_ATTRIBUTE_READONLY:文件为只读。
    5. FILE_ATTRIBUTE_SYSTEM:文件为系统文件。
  • hTemplateFile:该参数指向用于存储的文件句柄,如果不为0,则指定一个文件句柄,新文件将从这个文件中复制扩展属性。

如果该函数调用成功,则返回文件句柄。否则返回INVALID_HANDLE_VALUE。


WriteFile/ReadFile函数

在成功调用CreateFile创建文件句柄之后,就返回所打开或创建的文件的句柄,可调用WriteFile函数或者ReadFile函数来读取文件。

这两个文件的具体格式如下:

BOOL WriterFile(    HANDLE hFile,//文件句柄    LPCVOID lpBuffer,//数据缓冲区指针    DWORD nNumberOfBytesToWrite,//要写入的字节数    LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针    LPOVERLAPPED lpOverlapped//结构体指针    );BOOL ReadFile(    HANDLE hFile,//文件句柄    LPCVOID lpBuffer,//数据缓冲区指针    DWORD nNumberOfBytesToRead,//要读取的字节数    LPDWORD lpNumberOfBytesRead,//指向保存实际读取字节数的存储区域的指针    LPOVERLAPPED lpOverlapped//结构体指针    );

其中各个函数的具体要求如下:

  • hFile:该参数指向要读写的文件句柄,一般由CreateFile函数返回。
  • lpBuffer : 指向一个缓冲区,用于存储读写的数据。
  • nNumberOfBytesToWrite/Read : 这两个参数是表示要求写入或读取的字节数。
  • lpNumberOfBytesWritten/Read : 这两个参数是表示返回实际写入或读取的字节数。
  • lpOverlapped :是指向OVERLAPPED结构的指针,设置为NULL即可。

如果读取或写入操作成功,函数就会返回TRUE。在完成文件的读写操作后还需调用Handle函数关闭文件的句柄,以便其他程序对文件进行操作。


下面代码演示了如何在文件末尾写入数据,其具体过程如下:

#include <stdio.h>#include <windows.h>#include <iostream>int main(int argc, char* argv[]){    //调用CreateFile函数以只写方式打开一个文件    HANDLE hFile = CreateFile(argv[1], GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);    if (hFile == INVALID_HANDLE_VALUE)    {        printf("CreateFile error\n");        return 0;    }    //调用SetFilePointer函数调整文件指针位置,移动到文件末尾    if (SetFilePointer(hFile, 0, NULL, FILE_END) == -1)    {        printf("SetFilePointer error\n");        return 0;    }    char buff[256] = "配置信息";    DWORD dwWrite;    //把buff中的内容写入到文件末尾    if(!WriteFile(hFile, &buff, strlen(buff), &dwWrite, NULL))    {        printf("WriteFile Error\n");        return 0;    }    printf("往 %s 中写入数据成功\n",argv[1]);    CloseHandle(hFile);    return 0;}

其中SetFilePointer函数的作用是设置文件指针的位置。当一个文件被打开时,系统会维护一个文件指针,指向文件的下一个读写操作的位置,所以随着文件的读写,文件指针的位置也会随之移动。

我想要更好更远的月亮
想要未知的疯狂
想要声色的张扬

0 0