跳到主要内容

使用vc++ Win32 Mfc API创建文件,读文件和写文件

  • 作者:
  • 更新日期:

我是软件工程师。我已经使用c++、MFC和网络技术15年了。我喜欢电子游戏和读书。

1.简介

在本文中,我们将查看使用它仅仅而且OpenFilewin32 API函数与基于MFC对话框的应用程序。Win32是一个丰富的API,它提供了大量的函数,而MFC只是一个框架,包裹在这些函数之上,形成逻辑功能单元。Win32 API库是一种原生格式,这意味着它是C风格(过程方法),而MFC是一个基于oop的框架API。好的,让我们从样本开始。

2.关于示例

看看下面的截图:

Win32文件处理示例

Win32文件处理示例

在本例中,我们编写代码将文件内容从源位置复制到目标位置。普通文件内容复制操作已经被操作系统支持。这个例子是为了演示我们如何使用WIN32 API执行类似的动作但是,您可以通过跳过特定的单词或在单词中添加一些内容等方式将源内容扩展到目标。

在本例中,我们在源文件路径中指定要复制的文件名,并在标记为“目标文件路径”的文本框中指定目标文件名。的拷贝文件Win32 API可以很容易地完成这个任务。但是,在本文中,我们将探讨Win32文件处理功能。我们使用vc++基于对话框的应用程序创建这个示例。

下面的视频显示了创建基于对话框的应用程序。

创建应用程序(无音频)

在创建基于对话框的MFC应用程序后,我们将控件变量添加到编辑框控件中。如下面的视频所示:

滚动到继续

添加控制变量(无音频)

3)复制内容按钮处理程序

1)首先,声明文件的win32句柄,这些句柄是hcopsource, hCopyDest。接下来,变量bytes_read和bytes_written用于存储根据文件处理操作读取和写入的字节数。buffer变量被程序用作缓存来临时存储从文件中读取的数据。

//示例01:需要声明hcopysource, hCopyDest;DWORD bytes_read, bytes_written;CHAR缓冲区[4095];

2)接下来,我们从文本框控制变量中读取用户输入的内容。我们将其存储到字符串变量Source_file, Dest_file。的GetWindowText函数返回文本框中输入的文本。

//示例02:获取User输入源文件,Dest_file;m_edit_ctrl_from。GetWindowText(Source_file);m_edit_ctrl_to。GetWindowText(Dest_file);

3) Win32 API函数它仅仅用于打开用户输入的源文件。的OPEN_EXISTING标记将告诉API在文件已经退出时打开该文件,否则将失败。一旦要复制的文件内容被打开,我们将其句柄存储在hcopsource中。的GENERIC_READFlag表示我们将打开文件进行读取。

//示例03:创建源文件hcopsource =::它仅仅(Source_fileGENERIC_READ,FILE_SHARE_READ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,);如果(hcopsource == INVALID_HANDLE_VALUE)AfxMessageBox“无法打开源文件”);返回

4)与我们存储目标文件句柄的方式相同。在这里,我们期望目标文件夹中不存在该文件,并且我们总是尝试在指定的位置中将该文件创建为一个新文件。国旗GENERIC_WRITE说明我们将使用该文件在其上写入内容。的CREATE_ALWAYS属性表示我们将始终创建该文件。如果它在目标位置不存在,API将创建一个新文件,如果它在那个位置,那么函数将打开它。因此,标记总是创建文件并返回句柄。

//示例04:创建目标文件hCopyDest =::它仅仅(Dest_fileGENERIC_WRITE,0CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,);如果(hcopsource == INVALID_HANDLE_VALUE)AfxMessageBox“无法打开目标文件”);返回

5)我们使用ReadFileAPI从源文件中读取数据。一旦调用成功,我们将在缓冲区变量中获取读取内容。注意while循环的用法。当文件内容超过4095字节时,将继续批量读操作。我们在每个批处理中读取4095字节或更少(如果较少,这将是最后一次读取)字节。的bytes_read变量将告诉我们从源文件中读取了多少字节。例如,文件有5000字节的数据,第一个读批处理将读取所有4095个字节,其余5个字节将在下一次迭代中读取。这样,我们在使用API函数将数据写入目标文件时使用bytes_read变量WriteFile

//示例05:读取源文件的内容// 4095或更小的批,然后写入/ /目标文件(::ReadFile(hcopysource缓冲区,4095&bytes_read,bytes_read >0::WriteFile(hCopyDest缓冲区,bytes_read &bytes_written,);如果(bytes_read != bytes_written)装运箱味精;味精。附加“出问题了”);味精。附加“同时写信到目的地。”);味精。附加“终止操作。”);AfxMessageBox(味精);::CloseHandle(hcopysource);::CloseHandle(hCopyDest);返回AfxMessageBox"文件内容已复制至目标");

6)一旦操作完成,我们关闭由按钮单击事件打开的文件HANDLES。我们还显示一条消息,说明文件内容已复制到目标。

//范例06:做清洁工作m_edit_ctrl_from。SetWindowText"");m_edit_ctrl_to。SetWindowText"");::CloseHandle(hcopysource);::CloseHandle(hCopyDest);

使用Win32 API执行的复制文件操作-无音频

源代码:下载

©2018 sirama

相关文章

Baidu