《VC++深入详解》学习笔记---12章文件和注册表操作(2)

23 篇文章 0 订阅

四、Win32 API对文件操作的支持

1.文件的创建与打开

CreatFile 函数将创建或打开文件、管道、通信资源等对象,并返回一个读取该对象的句柄。

HANDLE CreaeFile(

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttribiutes,

HANDLE hTemplateFile

);

第一个参数:lpFileName,用于创建或打开的对象的名称;

第二个参数:dwDesiredAccess,用于指定对对象的访问方式。包括:0、GENERIC_READ、GENERIC_WRITE。

第三个参数:dwShareMode,用于指定共享方式。包括:FILE_SHARE_DELETE、FILE_SHARE_READ、FILE_SHARE_WRITE。

第四个参数:lpSecurityAttributes,用于指定我们所创建的文件对象的访问权限,以及文件对象句柄能否被子进程所继承。当将其指定为NULL时,将对象设置为默认安全权限。通常在创建服务器端软件时使用这个参数,客户端使用较少。

第五个参数:dwCreationDisposition,指定如何创建文件。必须为:CREATE_NEW、CREATE_ALWAYS、OPEN_EXISTING、OPEN_ALWAYS、TRUNCATE_EXISTING中的一个。

第六个参数:dwFlagsAndAttribiutes,设置文件属性和标志。包括:FILE_ATTRIBUTE_ARCHIVE、FILE_ATTRIBUTE_HIDDEN、FILE_ATTRIBUTE_NORMAL、FILE_ATTRIBUTE_OFFLINE等等,我再此不全部列出。

dwFlagsAndAttribiutes参数可以包含其中的一个或多个。

第七个参数:hTemplateFile,指定具有GENERIC_READ访问方式的模板文件的句柄。如果为此从参数传递了一个文件句柄,那么CreateFile函数会忽略为所创建的文件设置的属性标志,而是用hTemplateFile相关联的文件的属性标志。要注意的是,hTemplateFile必须是使用GENERIC_READ方式打开的。而且,如果是打开一个现有文件,而不是创建一个新文件,则这个参数将被忽略。所以,这个参数有效的条件有二:1.创建新文件,2.给hTemplateFile参数传递的文件句柄必须使用GENERIC_READ方式打开。


2.文件的写入

BOOL WriteFile(

HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped

);

第一个参数:hFile,指定要写入数据的文件的句柄。

第二个参数:lpBuffer,指向包含将要写入文件的数据的缓冲区的指针。

第三个参数:nNumberOfBytesWritten,指明要向文件中写入的字节数。

第四个参数:lpNumberOfBytesWritten,用来接收实际写入到文件中的字节数。

第五个参数:lpOverlapped,指向OVERLAPPED 结构体的指针。要想这个参数起作用,在CreateFile打开文件设置文件属性时要添加FILE_FLAG_OVERLAPPED标记,表明需要异步地访问这个文件。若没有这个标记,默认为以同步IO的方式访问这个文件。

实例:

HANDLE hFile;
hFile=CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWrites;
WriteFile(hFile,"http://my.csdn.net/",strlen("http://my.csdn.net/"),
&dwWrites,NULL);
CloseHandle(hFile);


3.文件的读取

BOOL ReadFile(

HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesRead,

LPOVERLAPPED lpOverlapped

);

第一个参数:hFile,指定要读取数据的文件的句柄。

第二个参数:lpBuffer,指向包含将要接收文件的数据的缓冲区的指针。

第三个参数:nNumberOfBytesWritten,指明要从文件中读取的字节数。

第四个参数:lpNumberOfBytesWritten,用来接收实际读取到的字节数。

第五个参数:lpOverlapped,指向OVERLAPPED 结构体的指针。


实例:

HANDLE hFile;

hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

DWORD dwReads;

char ch[100];

ReadFile(hFile,ch,100,&dwReads,NULL);

  ch[dwReads]=0;

CloseHandle(hFile);


五、MFC对文件操作的支持

1.  MFC中对文件操作的基类是:CFile。该类提供了无缓存的二进制的磁盘文件输入输出功能。其有三种形式的构造函数,其中之一为:CFile( LPCTSTR lpszFileName, UINT nOpenFlags );

其中第一个参数为指定文件的名称;第二个参数指定文件共享和访问的方式,访问方式可以设置一个或多个值的组合。

CFile类中还有很多方法,常用的包括:

Write:写入数据;

Read:读取数据;

Seek:将文件指针移动到指定的位置;

SeekToBegin:将文件指针放置到文件的开始位置;

SeekToEnd:将文件指针放置到文件的结尾处;

GetLength:获得文件的长度;

写入实例:

CFile file("6.txt",CFile::modeCreate | CFile::modeWrite);

file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));

file.Close();

读取实例:

CFile file("6.txt",CFile::modeRead);

char *pBuf;

DWORD dwFileLen;

dwFileLen = file.GetLenth();

pBuf=new char[dwFileLen+1];

pBuf[dwFileLen[=0;

file.Read(pBuf,dwFileLen);

file.Close();


2.  CFileDialog类

它是一个对话框类。

CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
第一个参数:BOOL类型,若设置为TRUE,将构建一个打开对话框;若设置为FALSE,将构建一个保存为对话框。
第二个参数:指定默认的文件扩展名。设置为NULL时,则不会为文件添加扩展名。
第三个参数:指定对话框的样式。
第四个参数:指定一个或一组文件过滤器。
第五个参数:用来指定文件对话框的父窗口或拥有者窗口。

打开文件对话框实例:
CFileDialog file(TRUE);
file.m_ofn.lpstrTitle="我的文件打开对话框";
file.m_ofn.lpstrFilter="Texr Files(*.txt)\0\0";
if(IDOK==file.DoModal())
{
CFile f(file.GetFileName(),CFile::modeRead);
char *puf;
DWORD dwFileLen;
dwFileLen = f.GetLength();
puf=new char[dwFileLen+1];
f.Read(puf,dwFileLen);
f.Close();
MessageBox(puf);
}

保存文件对话框实例:
CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle="我的文件保存对话框";
fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
fileDlg.m_ofn.lpstrDefExt="txt";
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值