windows文件及注册表编程

1、CFile文件操作类

CFile类提供了没有缓存的二进制格式的磁盘文件输入输出功能,通过其派生类能够支持文本文件和内存文件。

CFile::Open()用来打开文件,函数执行成功返回TRUE,否则返回FALSE,函数原型:

virtual BOOL Open(
   LPCTSTR lpszFileName,         //文件名
   UINT nOpenFlags,              //打开方式
   CFileException* pError = NULL //接收错误信息 
);
其中打开方式nOpenFlags可以有以下值或组合:

CFile::modeCreate 创建一个新的文件,如果文件存在将文件截取成长度为0。 ·
CFile::modeNoTruncate 此标志总是与modeCreate 配合使用,如果文件存在,不将文件截取成长度为0;如果文件不存在即创建新文件。这个功能往往很好用,比如说,当你需要打开一个设置文件,但是你并不清楚这个文件是否已经存在。
CFile::modeRead 只读方式打开。
CFile::modeReadWrite 读写方式打开。. ·
CFile::modeWrite 只写方式打开。 ·
CFile::modeNoInherit 阻止这个文件被子进程继承。 ·
CFile::shareDenyNone 打开这个文件同时允许其它进程读写这个文件。如果文件被其它进程以兼容的模式打开,这时create操作会失败。 ·
CFile::shareDenyRead 打开文件拒绝其它任何进程读这个文件。如果文件被其它进程用compatibility模式或者是读方式打开,create操作失败。. ·
CFile::shareDenyWrite 打开文件拒绝其它任何进程写这个文件。如果文件被其它进程用compatibility模式或者是写方式打开,create操作失败。 ·
CFile::shareExclusive 以独占方式打开这个文件,不允许其它进程读写这个文件。如果文件已经在其它程序或当前程序以其他方式打开来进行读写,将返回失败。 ·
CFile::shareCompat 这个标志在32位的MFC中无效。 ·
CFile::typeText 设置成对回车换行对有特殊处理的文本模式(仅用在派生类中)。 ·
CFile::typeBinary 设置二进制模式(仅用在派生类中) 。
数据成员
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指定的单个文件

pFrom:指定要操作的文件。该成员是一个路径,最好使用完整路径,在路径的文件名部分可以使用通配符,如“*”等,进行指定多个文件。虽然该成员申明的类型是LPCTSTR,一个以单个NULL字符(即\0)终结的字符串,但实际上是一个可以保存多个以NULL字符终结的文件名的缓冲,用来执行多个文件操作。需要注意的是该参数必须以两个\0字符来结尾。

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版本)

fAnyOperationsAborted:返回值参数,如果操作在完成前被人为取消或系统默认选择取消,则该成员被设置为True,否则为Flase。

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 WritePrivateProfileString(LPCTSTRlpAppName, LPCTSTR lpKeyName, LPCTSTR lpString,                                       LPCTSTRlpFileName);

读取.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;

WritePrivateProfileString("Student", "Name", StrName, "c:\\setting.ini");

结果:(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();

6、注册表

以下出自百度百科“注册表”:

注册表同样可以用来存储系统和应用程序的初始化和设置信息。在早期,大部分的系统和程序设置放在Win.ini、System.ini等多个初始化INI文件中,由于这些初始化文件不便于管理和维护,时常出现一些因INI文件遭到破坏而导致系统无法启动的问题。为了使系统运行得更为稳定、健壮,后来就使用注册表来存储系统和应用程序的初始化和设置信息

打开注册表编辑器:开始->运行 ->输入regedit

内容出处:《孙鑫VC++深入详解》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值