使用CreateFile读写文件

来源(博客频道 - CSDN.NET)

From: http://blog.csdn.net/u012877472/article/details/49699715

使用CreateFile读写文件

原创 2015年11月07日 10:38:35 标签:文件操作 6824

微软提供了强大的文件读写操作的编程接口,所以可以通过调用API函数实现文件的读写操作。这里通过CreateFile函数来实现。

要对文件进行读写操作,首先要调用CreateFile函数打开或者创建文件,函数具体格式如下:
HANDLE CreateFile(
	LPCTSTR,lpFileName,                        //指向文件名的指针
	DWORD dwDesiredAccess,                     //访问模式(读/写)
	DWORD dwShareMode,                         //共享模式
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指向安全属性的指针
	DWORD dwCreationDisposition,               //如何让创建
	DWORD dwFlagAndAttributes,                 //文件属性
	HANDLE hTemplateFile                       //用于复制文件句柄
);


各个参数的具体含义如下:

lpFileName:要打开的文件名;

dwDesiredAccess:如果是GENERIC_READ表示允许对设备进行读访问;如果是GENERIC_WRITE表示允许对设备进行写访问(可以组合使用);如果是0,表示只允许获取与一个设备有关的信息;

dwShareMode:定义共享模式。如果是0表示不共享;是FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享;

lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性;

dwCreationDisposition:指定当文件存在或不存在时的操作。常见的操作有5种:

CREATE_NEW:创建文件,如果文件存在会出错;

CREATE_ALWAYS:创建文件,会修改前一个文件;

OPEN_EXISTING:文件已经存在;

OPEN_ALWAYS:如果不存在就创建;

TRUNCATE_EXISTING:将现有的文件缩短为零长度;

dwFlagAndAttributes:表示新创建文件的属性。文件的常见属性有5种:

FILE_ATTRIBUTE_ARCHIVE:标记为归档属性;

FILE_ATTRIBUTE_NORMAL:默认属性;

FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录;

FILE_ATTRIBUTE_READONLY:文件为只读;

FILE_ATTRIBUTE_SYSTEM:文件为系统文件;

hTemplateFile:指向用于存储的文件句柄;如果不为0,则指定一个文件句柄,新的文件将从这个文件中复制扩展属性;

如果该函数调用成功,返回文件句柄;否则返回INVALID_HANDLE_VALUE。该函数的具体调用方式如下:

(1)以只读的方式打开已存在的文件

HANDLE hFile=CreateFile("1.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

(2)以只写的方式打开已存在的文件

HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

(3)创建一个新文件

HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

在成功调用CreateFile函数之后,返回所打开的或创建的文件句柄,可调用ReadFile或WriteFile函数来读写文件。函数具体格式如下:

BOOL WriteFile(
	HANDLE fFile,                  //文件句柄
	LPCVOID lpBuffer,              //数据缓存区指针
	DWORD nNumberOfBytesToWrite,   //所要写的字节数
	LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区的指针
	LPOVERLAPPED lpOverlapped      //OVERLAPPED结构体指针
)



BOOL ReadFile(
	HANDLE fFile,                  //文件句柄
	LPCVOID lpBuffer,              //数据缓存区指针
	DWORD nNumberOfBytesToRead,    //所要写的字节数
	LPDWORD lpNumberOfBytesRead,   //用于保存实际写入字节数的存储区的指针
	LPOVERLAPPED lpOverlapped      //OVERLAPPED结构体指针
)


其中各个参数含义如下:

hFile:指向要读写的文件的句柄,一般由CreateFile函数返回;

lpBuffer:指向一个缓冲区,用于存储读写的数据;

nNumberOfBytesToWrite/Read:表示要求写入或读取的字节数;

nNumberOfBytesWritten/Read:表示返回实际写入或读取的字节数;

lpOverlapped:是指向OVERLAPPED结构体的指针,设置为NULL即可;

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

下面的代码实现了在文件末尾写入数据的过程:

#include <stdio.h>
#include <windows.h>
int main()
{
	HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFILE==INVALID_HANDLE_VALUE)
	{
		printf("CreateFile error\n");
		return 0;
	}
	if(SetFilePointer(hFILE,0,NULL,FILE_END)==-1)
	{
		printf("SetFilePointer error\n");
		return 0;
	}
	char buff[256]="hello";
	DWORD dwWrite;
	if(!WriteFile(hFILE,&buff,strlen(buff),&dwWrite,NULL))
	{
		printf("WriteFile error\n");
		return 0;
	}
	printf("write %d.\n",dwWrite);
	printf("done.\n");
	CloseHandle(hFILE);
	return 0;
}


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



文件中内容如下:



下面的代码介绍了读取文件的过程:

#include <stdio.h>
#include <windows.h>
int main()
{
	HANDLE hFile=CreateFile("1.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile==INVALID_HANDLE_VALUE)
	{
		printf("CreateFile error.\n");
		return 0;
	}
	int file_size=0;
	file_size=GetFileSize(hFile,NULL);
	char *buff;
	buff=(char*)malloc(file_size);
	DWORD dwRead;
	if(!ReadFile(hFile,buff,file_size,&dwRead,NULL))
	{
		printf("ReadFile error.\n");
		return 0;
	}
	buff[file_size]='\0';
	printf("content:%s\n",buff);
	CloseHandle(hFile);
	return 0;
}


结果如下:



文件读取成功。

Link: http://www.asm32.net/article_details.aspx?id=7273


浏览次数 0 发布时间 2018/2/25 23:25:30 从属分类 VC++ 【评论】【 】【打印】【关闭
 
| www.asm32.net | 2006版 | 资料中心 | linux | asm/asm32 | C/C++ | VC++ | java | Python | 书签 | ASP.Net书签 | 京ICP备09029108号-1