1、CFile文件操作类
CFile类提供了没有缓存的二进制格式的磁盘文件输入输出功能,通过其派生类能够支持文本文件和内存文件。
CFile::Open()用来打开文件,函数执行成功返回TRUE,否则返回FALSE,函数原型:
virtual BOOL Open( LPCTSTR lpszFileName, //文件名 UINT nOpenFlags, //打开方式 CFileException* pError = NULL //接收错误信息 );其中打开方式nOpenFlags可以有以下值或组合:
m_hFile 常包含操作系统文件句柄
构造函数
CFile 从一个路径或文件句柄构造一个CFile对象;
Open 带错误检验选项,安全打开一个文件;
Close 关闭文件,删除对象。
Abort 不管任何警告和错误,关闭一个文件;
Duplicate 构造一个基于该文件的副本;
输入/输出
Read 从文件的当前位置读数据;
ReadHuge 可从文件的当前位置读取大于64K数据,在32位编程中废弃了,见Read;
Write 将文件数据写入当前文件位置;
WriteHuge 可将文件的大于64K数据写到当前文件位置,在32位编程中废弃了,见Write;
Flush 溢去未被写入的任何数据。
定位
Seek 定位于当前文件指针;
SeekToBegin 定位当前文件指针到文件开头;
SeekToEnd 定位当前文件指针到文件尾;
GetLength 获取文件长度;
SetLength 改变文件长度。
封锁
LockRange 在文件中封锁一定范围内的字节;
UnlockRange 解锁一定范围内的字节。
状态
GetPosition 获取当前文件指针;
GetStatus 获取打开文件的状态;
GetFileName 获取被选文件的文件名;
GetFileTitle 获取被选文件的标题;
GetFilePath 获取被选文件的完整路径;
SetFilePath 设置被选文件的完整路径
静态
Rename 改名指定文件
Remove 删除指定文件
GetStatus 获取指定文件的状态
SetStatus 设置指定文件的状态
eg:
//写文件
CFile file;
file.Open(L"1.txt", CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
file.Write(L"hello world!", sizeof(L"hello world!"));
file.Close();
//读文件
file.Open(L"1.txt", CFile::modeRead);
ULONGLONG ullFileLen = file.GetLength();
char *pBuf = new char[ullFileLen];
file.Read(pBuf, ullFileLen);
CString str((wchar_t*)pBuf);
AfxMessageBox(str);
file.Close();
2、带界面提示的文件操作
利用shell外壳函数SHFileOperation可以实现像平常复制或剪切文件时那样的效果。
以下转自:http://blog.csdn.net/tht2009/article/details/6753706
int SHFileOperation(_Inout_ LPSHFILEOPSTRUCT lpFileOp);
(1) 该函数的功能是 复制、移动、重命名、删除 一个文件系统对象。
(2) 参数lpFileOp是一个指向SHFILEOPSTRUCT结构体的指针,该参数不能为空,SHFILEOPSTRUCT结构体包含了该函数执行指定操作所需的信息。
(3) 返回值:成功返回0,否则返回非0。SHFILEOPSTRUCT结构体定义如下:
typedef struct _SHFILEOPSTRUCT { HWND hwnd; UINT wFunc; PCZZTSTR pFrom; PCZZTSTR pTo; FILEOP_FLAGS fFlags; BOOL fAnyOperationsAborted; LPVOID hNameMappings; PCTSTR lpszProgressTitle; } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
hwnd:显示文件操作信息对话框的窗口句柄。
wFunc:执行的操作,可取以下值。
可取的值 | 将执行的操作 |
FO_COPY | 将pFrom指定的文件复制到pTo |
FO_DELETE | 删除pFrom指定的文件 |
FO_MOVE | 将pFrom指定的文件移动到pTo |
FO_RENAME | 重命名pFrom指定的单个文件 |
pTo:指示目的文件夹(目录)或目的文件。该成员如果不用(如当wFunc=FO_DELETE时)必须设为NULL。和pFrom一样,该成员也是一个以两个NULL字符结尾的字符串,但该成员不能使用通配符。对于复制与移动操作,如果pTo指定的目录不存在,将显示一个询问是否创建新目录的对话框,要禁止显示该询问对话框而直接创建,请设置FOF_NOCONFIRMMKDIR到fFlags成员。如果fFlags中含有FOF_MULTIDESTFILES,pTo缓冲中可含多个文件名。
fFlag:控制文件操作标志。可取下列值通过“|”结合。
值 | 说明 |
FOF_ALLOWUNDO | 允许撤消,允许放回回收站。如果pFrom不包含完全限定路径和文件名,该标志将被忽视 |
FOF_CONFIRMMOUSE | (未使用) |
FOF_FILESONLY | pFrom的文件名部分含有通配符时只操作文件 |
FOF_MULTIDESTFILES | pTo指定多个目的文件而不是一个目的文件夹(目录) |
FOF_NOCONFIRMATION | 以“全部是”自动响应所有显示对话框 |
FOF_NOCONFIRMMKDIR | 不询问是否创建新目录(当操作需要创建新目录时自动创建) |
FOF_NO_CONNECTED_ELEMENTS | 不移动关联文件(5.0版本) |
FOF_NOCOPYSECURITYATTRIBS | 不复制属性,目的文件从新文件夹获取安全属性(4.71版本) |
FOF_NOERRORUI | 当出错时不显示对话框 |
FOF_NORECURSEREPARSE | (未使用) |
FOF_NORECURSION | 执行操作只针对当前目录,不递归针对子文件夹 |
FOF_NO_UI | 后台执行操作,不显示界面和所有对话框,相当于FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR。(6.0.6060版本——Windows Vista) |
FOF_RENAMEONCOLLISION | 当文件名冲突时执行重命名操作 |
FOF_SILENT | 不显示进度对话框界面 |
FOF_SIMPLEPROGRESS | 示进度对话框界面,但不显示当前正在操作的文件(简单模式) |
FOF_WANTMAPPINGHANDLE | 当已指定FOF_RENAMEONCOLLISION和所以文件已被重命名,分配一个包含新旧文件名的名称映射对象给hNameMappings成员,当不再使用该对象时,需用SHFreeNameMappings释放该对象 |
FOF_WANTNUKEWARNING | 当文件被永久删除而非删除到回收站时,给出一个警告(5.0版本) |
hNameMappings:一个名称映射对象句柄,该对象包含重命名文件的新旧文件名称。只有在fFlags成员含有FOF_WANTMAPPINGHANDLE标志时,该成员才可用。
lpszProgressTitle:进度对话框界面的标题,只有在fFlags成员含有FOF_SIMPLEPROGRESS标志时,该成员才有效。
使用例子:
SHFILEOPSTRUCTW lpFileOP;
lpFileOP.hwnd=m_hWnd;
lpFileOP.wFunc=FO_COPY;
lpFileOP.pFrom=_T("E:\\test1.VHA\0");
lpFileOP.pTo=_T("D:\\\0");
lpFileOP.fFlags=FOF_NOCONFIRMMKDIR; //自动创建目录
lpFileOP.hNameMappings=NULL;
lpFileOP.fAnyOperationsAborted=NULL;
lpFileOP.lpszProgressTitle=NULL;
SHFileOperation(&lpFileOP)
3、打开文件对话框、另存为对话框
可以利用CFileDialog类来显示一个“打开文件”或“另存为”对话框。
4、打开文件夹对话框
利用shell外壳函数SHBrowseForFolder实现,eg:
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
{
if(uMsg==BFFM_INITIALIZED)
{
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,
LPARAM(lpData));
}
}
return 0;
}
TCHAR chPath[255]; //用来存储路径的字符串
CString strPath = L"";
BROWSEINFO bInfo;
GetModuleFileName(NULL,chPath,MAX_PATH);
strPath=chPath;
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner = m_hWnd;
bInfo.lpszTitle = _T("请选择路径: ");
bInfo.ulFlags = BIF_RETURNONLYFSDIRS|BIF_EDITBOX;
bInfo.lpfn = BrowseCallbackProc;
bInfo.lParam = (LPARAM)strPath.GetBuffer(strPath.GetLength());
LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL) //用户按了确定按钮
{
SHGetPathFromIDList(lpDlist, chPath);//把项目标识列表转化成字符串
strPath = chPath; //将TCHAR类型的字符串转换为CString类型的字符串
g_strSavePath=strPath;
InvalidateRect(&MAKE_CRECT(520*g_dScaleNumberW,80*g_dScaleNumberH,402*g_dScaleNumberW,112*g_dScaleNumberH));
UpdateData(FALSE);
}
5、配置文件
配置文件(.ini)通常用来保存程序的一些初始化信息,当程序启动时从这个文件中读取这些信息。现在,很多软件将这些初始化信息写入到注册表中,从注册表中读取这些信息。
[ServerInfo]
Server_IP=www.haolaoshi.cc
以上为ini文件中的一段内容,其中中括号中内容称为“段名”,等号左边称“键名”,等号右边称“键值”。
::WriteProfileString()/::GetProfileString()分别用来写入和读取系统配置文件Win.int,Win.int位于系统安装目录下的Winnt目录下。
以下内容转自:http://blog.sina.com.cn/s/blog_4369de7e0100guz8.html
如果要读取指定配置文件,可以使用以下函数:
写入.ini文件:bool WritePrivateProfileStrin
读取.ini文件:DWORD GetPrivateProfileString(LPCTSTRlpAppName, LPCTSTRlpKeyName, LPCTSTRlpDefaut, LPSTRlpReturnedString, DWORD nSize, LPCTSTR lpFileName);
读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName, LPCTSTRlpKeyName, INT nDefault, LPCTSTR lpFileName);
参数的意思:
LPCTSTR lpAppName ------- INI文件中的一个字段名
LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名
LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型
LPCTSTR lpFileName --------完整的INI文件路径名
LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量
LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区
DWORD nSize ------接收缓冲区的大小
例子:
写入:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileStrin
结果:(INI文件中显示如下:)
[Student]
Name=jacky
读取:
CString SName;
GetPrivateProfileString("Student", "Name", "DefaultName", SName.GetBuffer(MAX_LENGTH), MAX_LENGTH, "c:\\setting.ini");
结果:SName ="jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
读整数比较简单,如下
int Result =GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即为所读取的结果!
在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
原代码如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH, des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo", "Server_IP", "", server_ip.GetBufferSetLength(15), 15, des);
server_ip.ReleaseBuffer();
以下出自百度百科“注册表”:
注册表同样可以用来存储系统和应用程序的初始化和设置信息。在早期,大部分的系统和程序设置放在Win.ini、System.ini等多个初始化INI文件中,由于这些初始化文件不便于管理和维护,时常出现一些因INI文件遭到破坏而导致系统无法启动的问题。为了使系统运行得更为稳定、健壮,后来就使用注册表来存储系统和应用程序的初始化和设置信息。
打开注册表编辑器:开始->运行 ->输入regedit。
内容出处:《孙鑫VC++深入详解》