C和C++都提供了对文件的操作方法,但是在程序中也提供了一些API函数来对文件进行操作。
文件的创建:调用CreateFile()函数来创建文件。其函数原型是:
HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDispostion ,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
函数调用成功以后,调用函数CloseHandle来关闭句柄。
操作成功则返回指向文件的句柄。其中的参数意义为:
lpFileName: 指定用于创建和打开的文件名或者对象名(CreateFile并不是单单创建文件,也可以创建其它的对象)
dwDesiredAccess:对象的访问方式(读,写等等)取值为
0(对象具有设备查询权限)
GENERIC_READ 对象具有读文件的权限,可以移动文件的指针
GENERIC_WRITE 写文件。可以通过或操作进行连接
dwShareMode:共享模式,如果为0则不共享,也可以取以下值
FILE_SHARE_READ 对文件进行只读共享
FILE_SHARE_WRITE 对文件进行写入共享
lpSecurityAttributes:指定对所创建对象的访问权限以及是否能够被子进程所继承。在客户端软件中很少用的,一般 直接设置为NULL.
dwCreationDispostion :指定如何创建文件。可以取以下值
CREATE_NEW 创建新文件,如果文件存在,则函数调用失败
CREATE_ALWAYS 创建新文件,如果文件存在,则函数清空所有现有属性
OPEN_EXISTING 打开现有文件,如果文件不存在,则函数调用失败
OPEN_ALWAYS 打开现有文件,如果文件不存在,则函数将创建新的文件(类似CREATE_NEW)
TRUNCATE_EXISTING 打开现有文件,一旦文件被打开,则其长度被截断成0,函数必须用GENERIC_WRITE来访问该文件。
-
dwFlagsAndAttributes:设定文件的属性和标志,可以是一下值的任意组合
-
FILE_ATTRIBUTE_ARCHIVE 存档文件,应用程序用此来标记文件的备份或删除
FILE_ATTRIBUTE_HIDDEN 隐藏文件
-
FILE_ATTRIBUTE_NORMAL 一般都采取此方式,单独使用
FILE_ATTRIBUTE_READONLY 只读文件
-
FILE_ATTRIBUTE_SYSTEM 系统文件
FILE_ATTRIBUTE_TEMPORARY 临时文件
-
-
FILE_FLAG_WRITE_THROUGH 数据不经过缓存直接写入文件
FILE_FLAG_OVERLAPPED 指示系统初始化该文件对象
- FILE_FLAG_RANDOM_ACCESS 随机读取文件
hTemplateFile:指定具有GENERIC_READ访问方式的模板文件的句柄,如果该参数为不为空,则CreateFile函数会忽略所有指定的属性,而直接采用模板文件的属性。注意,只有在GENERIC_READ方式下才可以。否则设置为NULL
文件的写入:调用WriteFile函数来向文件中写入数据。其函数原型为
WriteFile
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped
);
参数说明:
hFile:CreateFile函数所创建的文件句柄
lpBuffer:缓冲区数组
nNumberOfBytesToWrite:指明向文件中写入的字节数
lpNumberOfBytesWritten:实际写入到文件的字节数
lpOverlapped:一般设置为NULL.表示以同步的方式写入。如果在CreateFile函数中指定了
FILE_FLAG_OVERLAPPED标记,则可以传入一个OVERLAPPED结构体的指针。
读取文件:调用ReadFile函数来执行对文件的读入操作
BOOL ReadFile( HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
各参数的含义和WriteFile函数中是一样的。
同上,用一个例子来使用上述函数
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hFile;
//创建文件
hFile=CreateFile("3.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
//接受实际写入的字节数
DWORD dwWrites;
//写入数据
WriteFile(hFile,"调用API函数向文件中写入数据",strlen("调用API函数向文件中写入数据"),&dwWrites,NULL);
CloseHandle(hFile);
//读取文件的内容
//创建文件
hFile=CreateFile("3.txt",GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
//接受实际读取的字节数
DWORD dwReads;
//创建缓冲区,存放从文件中读取的数据
char buffer[100];
memset(buffer,0,100);
ReadFile(hFile,buffer,100,&dwReads,NULL);
CloseHandle(hFile);
for(int i=0;i<100;i++)
{
if(buffer[i])
cout<<buffer[i];
}
return 0;
}