Windows程序设计学习笔记——ini文件和注册表

一、ini文件及相关操作

ini文件用于保存应用程序的配置信息,内容以键值对的形式呈现,形如

[SECTION]

key=value

ini文件相关api(一部分):

BOOL WINAPI WriteProfileSection(
  __in  LPCTSTR lpAppName,    
  __in  LPCTSTR lpString
);

BOOL WINAPI WriteProfileString(
  __in  LPCTSTR lpAppName,    //节名
  __in  LPCTSTR lpKeyName,    //键名
  __in  LPCTSTR lpString       //值
);
BOOL WINAPI GetPrivateProfileStruct(
  __in   LPCTSTR lpszSection,
  __in   LPCTSTR lpszKey,
  __out  LPVOID lpStruct,
  __in   UINT uSizeStruct,
  __in   LPCTSTR szFile
);

DWORD WINAPI GetProfileString(
  __in   LPCTSTR lpAppName,
  __in   LPCTSTR lpKeyName,
  __in   LPCTSTR lpDefault,    //默认值
  __out  LPTSTR lpReturnedString,
  __in   DWORD nSize
);

DWORD WINAPI GetProfileSection(
  __in   LPCTSTR lpAppName,
  __out  LPTSTR lpReturnedString,
  __in   DWORD nSize
);
BOOL WINAPI WritePrivateProfileString(
  __in  LPCTSTR lpAppName,
  __in  LPCTSTR lpKeyName,
  __in  LPCTSTR lpString,
  __in  LPCTSTR lpFileName    //ini文件名(可填路径)
);



其中带private的是给用户自定义的ini文件使用的,不带private是给win.ini使用

二、注册表及相关操作

注册表是windows操作系统中的一个重要数据库,存储着系统和应用程序的配置信息。

1.创建注册表项:

LONG WINAPI RegCreateKeyEx(
  __in        HKEY hKey,       
  __in        LPCTSTR lpSubKey,    //新键(子项),要填路径
  __reserved  DWORD Reserved,    //保留,填0
  __in_opt    LPTSTR lpClass,    //可忽略,填NULL
  __in        DWORD dwOptions,
  __in        REGSAM samDesired,
  __in_opt    LPSECURITY_ATTRIBUTES lpSecurityAttributes,    //安全属性
  __out       PHKEY phkResult,    //回传参数,项的句柄指针
  __out_opt   LPDWORD lpdwDisposition    //可忽略,填NULL
);

函数成功返回ERROR_SUCCESS,失败返回错误码

第一个参数hkey是注册表项的句柄,表明要创建的项位于以下其中一个之下

HKEY_CLASSES_ROOT

HKEY_CURRENT_CONFIG

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

第5个参数dwOptions是一个属性参数,可为以下之一:

 REG_OPTION_NON_VOLATILE表示重启后项仍存在,REG_OPTION_VOLATILE则表示重启后不保留。

第六个参数samDesired 用于指定注册表安全和访问权限,其值有如下:

 使用完毕后需要关闭注册表项的句柄:

LONG WINAPI RegCloseKey(
  __in  HKEY hKey
);

2.打开句柄:

LONG WINAPI RegOpenKeyEx(
  __in        HKEY hKey,
  __in_opt    LPCTSTR lpSubKey,
  __reserved  DWORD ulOptions,
  __in        REGSAM samDesired,
  __out       PHKEY phkResult
);

3.设置注册表项下指定值的数据和类型:

LONG WINAPI RegSetValueEx(
  __in        HKEY hKey,            //句柄
  __in_opt    LPCTSTR lpValueName,    //值名
  __reserved  DWORD Reserved,       //保留填0
  __in        DWORD dwType,        //数据类型
  __in_opt    const BYTE* lpData,    //数据
  __in        DWORD cbData    //数据大小
);

返回值同RegCreateKeyEx

其中数据类型参数dwType可填如下值:

4.删除值和项:

LONG WINAPI RegDeleteValue(
  __in      HKEY hKey,
  __in_opt  LPCTSTR lpValueName
); 
//删除值
LONG WINAPI RegDeleteKey(
  __in  HKEY hKey,         //句柄
  __in  LPCTSTR lpSubKey    //项名
);

//删除键(项),注意要用该api删除的项不能有子项

如果lpSubKey指定了一个路径,hKey需要填上级项的句柄,例如lpSubKey填入SOFTWARE\\YouKu\\mytest,则hKey需要填HKEY_CURRENT_USER

如果注册表项含有子项,可用如下api删除:

LONG WINAPI RegDeleteTree(
  __in      HKEY hKey,
  __in_opt  LPCTSTR lpSubKey
);

5.修改键(项)名:
LSTATUS RegRenameKey(
  HKEY    hKey,
  LPCWSTR lpSubKeyName,
  LPCWSTR lpNewKeyName
);

6.检索注册表项的相关信息,如查看有多少个项:

LONG WINAPI RegQueryInfoKey(
  __in         HKEY hKey,
//以下全部是传出参数,不需要可填NULL
  __out        LPTSTR lpClass,
  __inout_opt  LPDWORD lpcClass,
  __reserved   LPDWORD lpReserved,
  __out_opt    LPDWORD lpcSubKeys,    //子键数
  __out_opt    LPDWORD lpcMaxSubKeyLen,    //最长子键名长度
  __out_opt    LPDWORD lpcMaxClassLen,
  __out_opt    LPDWORD lpcValues,        //值个数
  __out_opt    LPDWORD lpcMaxValueNameLen,    //最大值名称长度
  __out_opt    LPDWORD lpcMaxValueLen,    //值最长数据大小
  __out_opt    LPDWORD lpcbSecurityDescriptor,
  __out_opt    PFILETIME lpftLastWriteTime
);

7.遍历子键(子项):

LONG WINAPI RegEnumKeyEx(
  __in         HKEY hKey,
  __in         DWORD dwIndex,    //索引
  __out        LPTSTR lpName,
  __inout      LPDWORD lpcName,
  __reserved   LPDWORD lpReserved,
  __inout      LPTSTR lpClass,
  __inout_opt  LPDWORD lpcClass,
  __out_opt    PFILETIME lpftLastWriteTime
);

8.遍历值:

LONG WINAPI RegEnumValue(
  __in         HKEY hKey,
  __in         DWORD dwIndex,
  __out        LPTSTR lpValueName,
  __inout      LPDWORD lpcchValueName,
  __reserved   LPDWORD lpReserved,
  __out_opt    LPDWORD lpType,
  __out_opt    LPBYTE lpData,
  __inout_opt  LPDWORD lpcbData
);

示例:

int main()
{	
	//创建一个新项
	HKEY mykey = NULL;
	LONG errcode = RegCreateKeyEx(
		HKEY_CURRENT_USER,
		"SOFTWARE\\YouKu\\mytest",
		0,
		NULL,
		REG_OPTION_NON_VOLATILE,
		KEY_ALL_ACCESS,
		NULL,
		&mykey,
		NULL
	);
	if (errcode == ERROR_SUCCESS)
	{
		cout << "succeed in creating key!"<<endl;
	}

	//创建指定项的值
	char buff[] = "我是数据";
	errcode = RegSetValueEx(
		mykey,
		"我是名称",		//值名称
		0,
		REG_SZ,		//数据类型
		(BYTE*)buff,	
		sizeof(buff)	//数据及其大小
	);
	if (errcode == ERROR_SUCCESS)
	{
		cout << "succeed in creating value"<<endl;
	}

	//删除值
	errcode = RegDeleteValue(mykey, "我是名称");
	if (errcode == ERROR_SUCCESS)
	{
		cout << "succeed in deleting value"<<endl;
	}

	//删除键(项)
	errcode = RegDeleteKey(HKEY_CURRENT_USER,"SOFTWARE\\YouKu\\mytest");
	if (errcode == ERROR_SUCCESS)
	{
		cout << "succeed in deleting key" << endl;
	}

	//遍历子键(子项)
	DWORD total_key=0;		//存储子键个数
	HKEY hkey = NULL;
	errcode = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE", 0, KEY_ALL_ACCESS, &hkey);	//打开键(获取句柄)
	errcode = RegQueryInfoKey(hkey,NULL,NULL,NULL,&total_key,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
	for (DWORD i = 0; i < total_key; i++)
	{
		char keyname[MAXBYTE] = {};
		DWORD len = sizeof(keyname);
		RegEnumKeyEx(hkey, i, keyname, &len, NULL, NULL, NULL, NULL);
		wcout << keyname << endl;
	}

	//遍历值
	HKEY hkey2 = NULL;
	errcode = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\360\\360BDoctor", 0, KEY_ALL_ACCESS, &hkey2);
	cout << endl;
	DWORD total_value = 0;
	errcode = RegQueryInfoKey(hkey2, NULL, NULL, NULL, NULL, NULL, NULL, &total_value, NULL, NULL, NULL, NULL);
	for (DWORD i = 0; i < total_value; i++)
	{
		//遍历值类型和名称
		char valuename[MAXBYTE] = {};
		DWORD valuenamelen = sizeof(valuename);
		DWORD type = 0;
		RegEnumValue(hkey2, i, valuename, &valuenamelen, NULL, &type, NULL, NULL);
		wcout << i << "." << type << ":" << valuename << endl;
	}

	RegCloseKey(mykey);		//关闭句柄
	RegCloseKey(hkey);
	RegCloseKey(hkey2);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件上传是Web开发中常见的功能之一,Java中也提供了多种方式来实现文件上传。其中,一种常用的方式是通过Apache的commons-fileupload组件来实现文件上传。 以下是实现文件上传的步骤: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` 2.在前端页面中添加文件上传表单: ```html <form method="post" enctype="multipart/form-data" action="upload"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 3.在后台Java代码中处理上传文件: ```java // 创建一个DiskFileItemFactory对象,用于解析上传的文件 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置缓冲区大小,如果上传的文件大于缓冲区大小,则先将文件保存到临时文件中,再进行处理 factory.setSizeThreshold(1024 * 1024); // 创建一个ServletFileUpload对象,用于解析上传的文件 ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的大小限制,这里设置为10MB upload.setFileSizeMax(10 * 1024 * 1024); // 解析上传的文件,得到一个FileItem的List集合 List<FileItem> items = upload.parseRequest(request); // 遍历FileItem的List集合,处理上传的文件 for (FileItem item : items) { // 判断当前FileItem是否为上传的文件 if (!item.isFormField()) { // 获取上传文件文件名 String fileName = item.getName(); // 创建一个File对象,用于保存上传的文件 File file = new File("D:/uploads/" + fileName); // 将上传的文件保存到指定的目录中 item.write(file); } } ``` 以上代码中,首先创建了一个DiskFileItemFactory对象,用于解析上传的文件。然后设置了缓冲区大小和上传文件的大小限制。接着创建一个ServletFileUpload对象,用于解析上传的文件。最后遍历FileItem的List集合,判断当前FileItem是否为上传的文件,如果是,则获取文件名,创建一个File对象,将上传的文件保存到指定的目录中。 4.文件上传完成后,可以给用户一个提示信息,例如: ```java response.getWriter().write("File uploaded successfully!"); ``` 以上就是使用Apache的commons-fileupload组件实现文件上传的步骤。需要注意的是,文件上传可能会带来安全隐患,因此在处理上传的文件时,需要进行严格的校验和过滤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值