MFC中文件的建立

在操作系统中,文件是放在一定的目录下,在创建以及操作文件以前,我们要查看文件要保存的目录有没有存在,如果不存在要创建。这就要用到GetFileAttributes()和CreateDirectory()两个函数。下面是这两个函数的简介:

1、GetFileAttributes

函数原型:

DWORD WINAPI GetFileAttributes( __in LPCTSTR lpFileName );

函数参数

lpFileName [in] :文件或目录的名字,对于ANSI版本,名字不能大于MAX_PATH。

函数返回值

如果函数成功,返回值包含文件或目录的属性。如果函数失败,返回值是INVALID_FILE_ATTRIBUTES。

在MSDN中,文件总共有15种属性,根据磁盘的分区格式不同,文件的属性也会不同。现在针对GetFileAttributes 函数的返回值做以下整理:

返回字段

返回值

属性类型

FILE_ATTRIBUTE_READONLY

1

只读

FILE_ATTRIBUTE_HIDDEN

2

隐藏

FILE_ATTRIBUTE_SYSTEM

4

系统

FILE_ATTRIBUTE_DIRECTORY

16

目录

FILE_ATTRIBUTE_ARCHIVE

32

存档

FILE_ATTRIBUTE_DEVICE

64

保留

FILE_ATTRIBUTE_NORMAL

128

正常

FILE_ATTRIBUTE_TEMPORARY

256

临时

FILE_ATTRIBUTE_SPARSE_FILE

512

稀疏文件

FILE_ATTRIBUTE_REPARSE_POINT

1024

超链接或快捷方式

FILE_ATTRIBUTE_COMPRESSED

2048

压缩

FILE_ATTRIBUTE_OFFLINE

4096

脱机

FILE_ATTRIBUTE_NOT_CONTENT_INDEXED

8192

索引

FILE_ATTRIBUTE_ENCRYPTED

16384

加密

FILE_ATTRIBUTE_VIRTUAL

65536

虚拟

橙色标记的属性为Windows系统中文件的公有属性,其中“只读”、“隐藏”、“系统”、“存档”为文件的四种基本属性。compressed,content_indexed,encrypted只存在于NTFS分区中。

文件去掉全部属性后(四种基本属性),将自动标记为normal。同时具有system和hidden属性的文件会在系统中彻底隐形,这也是病毒常用的伎俩。

commpressed和encrypted不能共存。默认情况下文件都有content_indexed属性

以上内容转自:http://hi.baidu.com/li0544/item/5c6a4f0872c7ac18ebfe3856

2、CreateDirectory

函数原型

BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );

第一个参数值为文件夹名称,第二个参数值为安全属性,一般设置为NULL即可。如果正确创建,返回值为1,如果没有正常创建文件夹,则返回0。

  特别的:该函数每次调用时都只能创建一级文件夹,即文件夹中不能再包含子文件夹。

  当希望创建含有子文件夹的文件夹时,可以先使用该函数创建一级文件夹,然后再使用该函数在一级文件夹下创建子文件夹。如:

  希望创建:d:\\TEST\\temp,

  则:CString str = “d:\\TEST”;

  CreateDirectory(str, NULL);

  str = str + \\temp;

CreateDirectory(str, NULL);

综合利用以上两个函数的例子如下:

if (!(GetFileAttributes("DataBase")==FILE_ATTRIBUTE_DIRECTORY))

{

if (!CreateDirectory("DataBase",NULL))

{

AfxMessageBox("Make Dir Error");

}

}

接下来我们就要直接编写文件并且直接对文件进行打开、关闭、读、写等操作。MFC把这些对文件的操作封装到了一个叫做CFile的类中,使用这个类的对象能够以更直接的方式来处理文件。

CFile是MFC文件类的基类,它直接提供非缓冲的二进制磁盘输入/输出设备,并直接地通过派生类支持文本文件和内存文件。

使用CFILE类必须包含 #include <afx.h>

通常,CFILE类的构造过程中会自动打开磁盘文件,在析构函数中则会自动关闭文件。你可以使用静态成员函数来询问文件的状态而不用打开文件。

在MFC里面,打开一个文件最常用的方法分为以下两步:

  1.创建一个用于打开文件的对象,通常都是声明一个CFile或者一个CFile派生类的对象。

2.调用该CFile对象的Open方法,并提供一个文件路径和打开方式作为Open方法的参数。

下面就Cfile类封装的函数进行介绍

1、CFile::Open

  Open函数的原型如下:

virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );

返回值:成功为非0,否则为0,仅当返回值为0时pError参数才有意义

参数:

lpszFileName 需要打开文件的路径字符串,这个路径可以是相对路径也可以是绝对路径,或者是网络名字(UNC)

nOpenFlags 一个UINT定义文件的存取共享模式。它指定文件打开时可以采取的操作。你可以使用”|"号来组合多个选项。文件的一个存取权限和一个共享选项是必须要指定的。而modeCreate 和modeNoInherit是可选的。

具体如下:

CFile::modeCreate 让构造器创建一个新文件,如果那个文件已经存在,把那个文件的长度重设为

CFile::modeNoTruncate 可以同modeCreate. 一起用,如果要创建的文件已经存在,并不把它长度设置为0,因而这个文件获取或者作为一个新建文件或者作为一个已存在文件打开。这个功能往往很好用,比如说,当你需要打开一个设置文件,但是你并不清楚这个文件是否已经存在。

CFile::modeRead 打开文件仅仅供读

CFile::modeReadWrite 打开文件供读写

CFile::modeWrite 打开文件只供写

CFile::modeNoInherit 阻止这个文件被子进程继承

CFile::shareDenyNone 打开这个文件同时允许其它进程读写这个文件。如果文件被其它进程以incompatibility模式打开,这是create操作会失败。

CFile::shareDenyRead 打开文件拒绝其它任何进程读这个文件。如果文件被其它进程用compatibility模式或者是读方式打开,create操作失败。

CFile::shareDenyWrite 打开文件拒绝其它任何进程写这个文件。如果文件被其它进程用compatibility模式或者是写方式打开,create操作失败。

CFile::shareExclusive 以独占方式打开这个文件,不允许其它进程读写这个文件。 Construction fails if the file has been opened in any other mode for read or write access, even by the current process.

CFile::shareCompat 这个标志在32位的MFC中无效。 This flag maps to CFile::shareExclusive when used in CFile::Open.

CFile::typeText 设置成对回车换行对有特殊处理的文本模式(仅用在派生类中)

CFile::typeBinary 设置二进制模式(仅用在派生类中)

pError-------一个指向一个已经存在的file-exception类的指针,它会接收文件失败操作的具体状态。

注明:

OPEN默认是用在CFILE的构造器中,这两个函数提供了一个对文件的安全访问方式,即使发生了错误也会正确的回报错误。

以上内容转自http://blog.sina.com.cn/s/blog_673209640100i6pi.html

// example for CFile::Open
CFile f;
CFileException e;
char* pFileName = "test.dat";
if(!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite,&e))
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e.m_cause<<"\n";
#endif
}

注:CFileException类:

一个CFileException对象代表了与文件相关的异常。CFileException类包括有可移植的原因代码和操作系统指定错误值等公共数据成员。此类也提供产生文件异常的静态成员函数,返回操作系统和C运行中的错误原因代码。

  CFileException对象在CFile成员函数中被创建和产生,也可在派生类成员函数中创建或产生。可在CATCH表达式范围内访问这些对象。因为可移植,可以仅用出错代码获取异常的原因。

  #include <afx.h>

  CFileException类的成员

  数据成员

m_cause

包含异常原因相对应的可移植代码

m_IosError

包含相关操作系统错误代码

m_strFileName

包含异常的文件名

  构造函数

CFileException

构造一个CFileException对象

  代码转换

OsErrorToException

返回与操作系统错误值相对应的出错原因代码

ErrnoToException

返回与运行错误值相对应的出错原因代码

  帮助函数

ThrowOsError

返回一个基于操作系统错误值相对应的出错原因代码

ThrowErrno

产生一个基于运行错误值的文件异常

2、CFile::Read

函数原型

virtual UINT Read (void* lpBuf,UINT nCount);
返回值:
传输到缓冲区的字节数。注意对所有CFile类,如果到达文件尾,则返回值可能比nCount小。
参数: lpBuf 指向用户提供的缓冲区以接收从文件中读取的数据。 nCount 可以从文件中读出的字节数的最大值。对文本模式的文件,回车换行作为一个字符。
说明:从与CFile对象相关联的文件读数据到缓冲区。

示例:
// example for CFile::Read
extern CFile cfile;
char pbuf[100];
UINT nBytesRead = cfile.Read(pbuf,100);

3、CFile::Write

函数原型

virtual void Write(const void* lpBuf,UINT nCount);
throw (CFileException);
参数: lpBuf 指向用户提供的缓冲区,包含将写入文件中的数据。 nCount 从缓冲区内传输的字节数。对文本模式的文件,回车换行作为一个字符。
说明:
将数据从缓冲区写入与CFile对象相关联的文件

示例:// example for CFile::Write
extern CFile cfile;
char pbuf[100];
cfile.Write(pbuf,100);

4、CFile::Seek

在打开的文件中重新定位一个指针。

函数原型

virtual LONG Seek(LONG lOff,UINT nFrom);
throw(CFileException);

返回值:如果要求的位置合法,则Seek返回从文件开始起的新字节偏移量。否则值未定义并产生CFileException异常。
参数: lOff 指针移动的字节数。 nFrom 指针移动的模式,可为以下值之一:

CFile::begin 从文件开始,把指针向后移动lOff字节。

CFile::current 从当前位置开始,把指针向后移动lOff字节。

CFile::end 从文件尾开始,把指针向前移动lOff字节。注意必须移动到存在的文件中,因而lOff应为负。如果为正值,则超出文件尾。

示例:
// example for CFile::Seek
extern CFile cfile;
LONG lOffset = 1000;
LONG lActual = cfile.Seek(lOffset, CFile::begin);

5、CFile::SeekToBegin

函数原型:

void SeekToBegin( );
说明:
将文件指针指向文件开始处,等价于Seek(0L, CFile::begin)
示例:// example for CFile::SeekToBegin
extern CFile cfile;
cfile.SeekToBegin( );

6、CFile::SeekToEnd

函数原型:

DWORD SeekToEnd( );
返回值:文件长度(字节数)。
说明:
将文件指针指向文件逻辑尾部,等价于CFile::Seek( 0L, CFile::End);
示例:// example for CFile::SeekToEnd
extern CFile cfile;
DWORD dwActual = cfile.SeekToEnd( );

6、CFileFind类

CFileFind( );//构造函数。

virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwUnused = 0);

参数: pstrName 指向待找文件名字符串,如果为NULL,则查找以*.*形式进行。

dwUnused 保留,以使FindFile在派生类多形,必须为0。

n virtual BOOL FindNextFile( );

返回值:如果还有文件,则返回非零值;如果为最后一个文件,则为0。

以下代码将当前目录下的文件枚举出来并打印每个文件名:
CFileFind finder
BOOL bWorking = finder.FindFile("*.*");
while(bWorking)
{
bWorking = finder.FindNextFile( );
cout <<(LPCTSTR) finder.GetFileName( ) <<endl;

}

时间: 2024-08-07 09:00:55

MFC中文件的建立的相关文章

MFC中文件对话框类CFileDialog详解及文件过滤器说明

当前位置?:?首页???文章分类?:? 开发 ??? MFC中文件对话框类CFileDialog详解及文件过滤器说明 上一篇 利用OpenCV从摄像头获得图像的坐标原点是在左下角 下一篇 Word中为图表生成目录 域名迁移公告 2017年12月20日起,本博客迁移到新域名madaimeng.com,旧域名masikkk.com不再更新内容,但将永久保持可访问! 阅读 大专栏  MFC中文件对话框类CFileDialog详解及文件过滤器说明busuanzi_value_page_pv"> 评

MFC中浏览文件和浏览目录的实现[转]

1. 浏览文件 1 void CDlgCompare::OnBnClickedBtnSel() 2 { 3 // TODO: Add your control notification handler code here 4 UpdateData(TRUE); 5 CFileDialog fileDlg(TRUE); 6 fileDlg.m_ofn.lpstrTitle="文件打开对话框"; 7 fileDlg.m_ofn.lpstrFilter="All Files(*.*

VS2013 MFC应用程序工程中文件的组成

 前言: Debug文件  Release文件 Debug版本的可执行文件中包含了用于调试的信息和代码,而Release版本则没有调试信息,不能进行调试,但可执行文件比较小 1.解决方案相关文件 解决方案相关文件包括解决方案文件夹下的.sdf文件..sln文件..suo文件和ipch文件夹. .sdf文件和ipch目录一般占用空间比较大,几十兆甚至上百兆,与智能提示.错误提示.代码恢复和团队本地仓库等相关. .sln文件和.suo文件为MFC自动生成的解决方案文件,它包含当前解决方案中的工程

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W

MFC打开文件的方法

已经看懂的方法: CFileDialog类封装了Windows常用的文件对话框.常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能. CFileDialog的语法: CFileDialog(BOOL      bOpenFileDialog, LPCTSTR     lpszDefExt=NULL, LPCTSTR      lpszFileName=NULL, DWORD     dwFlags     =     OFN_HIDEREADONLY    

在VC/MFC中嵌入Google地图——图文并茂

最近需要实验室需要将在无人机地面站中嵌入地图,在网上找了很多资料,终于有些眉目了, 首先,做这个需要用到的知识有,MFC控件.MFC类库.JavaScript脚本语言,Google API.Google离线地图:由于google离线地图不怎么会,首先从google在线地图开始. 下面总结一下这几天搞google地图的步骤,有附图,对MFC和JS脚本语言不懂的同学有用. 在线Google 地图步骤: (1).建立基于对话框的MFC工程. 由于我对MFC基本不了解,所以从网上下载了个例子,但是不知道

MFC中的GDI绘图&lt;转&gt;

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

MFC中BMP图片双显和灰度

<一>. Bmp图片双显和灰度原理 为了方便后续的量化采样处理,这里首先要实现bmp图片双显的功能,即在menu的左边显示原图,把原图的文件头数据和信息头数据保存在全局变量数组中:同时建立一个临时的”picture.bmp”图片(默认保存路径在打开原图的位置),以后的操作对临时的图片进行处理. 1 什么叫灰度图?任何颜色都有红.绿.蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度: 浮点算法:Gray=R*0.3+G*0.59+B*0.11

MFC中使用FLASH

一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约为2.66M),并安装.对于Windows 32位系统,其默认安装目录为:C:\WINDOWS\system32\Macromed\Flash\:对于64位系统,为:C:\Windows\SysWOW64\Macromed\Flash. Flash控件的大版本号用数字表示,如9,10,11等,小版本