系统相关功能开发(二)-磁盘操作


1.监视硬盘

void CDiskOperDlg::OnButtonMonitorDisk()			// 监视硬盘
{	
	UpdateData(TRUE);								// 从控件获取数据
	DWORD dwWaitStatus; 
	HANDLE dwChangeHandle;
	dwChangeHandle=FindFirstChangeNotification(m_DiskName, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME); 
 	if (dwChangeHandle==INVALID_HANDLE_VALUE)
        return; 
	bMonitor = TRUE;
	WriteLog("正在监视%c盘重命名操作......", m_DiskName[0]);
	while (bMonitor) 
	{  
		dwWaitStatus = WaitForSingleObject(dwChangeHandle, INFINITE); 
		if (dwWaitStatus == WAIT_OBJECT_0)
		{
			WriteLog("检测到%s文件重命名操作",m_DiskName);
            MessageBox(m_DiskName,"检测到磁盘重命名操作");
			if (FindNextChangeNotification(dwChangeHandle) == FALSE) 
				bMonitor = FALSE;		
		}
		Sleep(100);
    } 
	FindCloseChangeNotification(dwChangeHandle);
}


2.格式化磁盘

void CDiskOperDlg::OnButtonFormat()		// 格式化磁盘
{	
	UpdateData(TRUE);
	UINT uiDriver = m_DiskName[0] - 'A';
	HINSTANCE   hInstance=LoadLibrary(_T("Shell32.dll"));     
	if (hInstance == NULL)   return; 
	PFUNCTIONFORMAT   pFunctionFormat=(PFUNCTIONFORMAT)GetProcAddress(hInstance, _T("SHFormatDrive"));       
	if(pFunctionFormat==NULL)     
	{     // 如果没有获取格式化SHFormatDrive函数的指针,则返回
		FreeLibrary(hInstance);     
		return;     
	}
	DWORD dwResult = (pFunctionFormat)(this->m_hWnd, uiDriver, SHFMT_ID_DEFAULT, SHFMT_OPT_FULL);
	switch (dwResult)
	{
	case SHFMT_ERROR:
		WriteLog("格式化磁盘%s发生错误", m_DiskName);
		break;
	case SHFMT_CANCEL:
		WriteLog("取消格式化磁盘%s", m_DiskName);
		break;
	case SHFMT_NOFORMAT:
		WriteLog("不能格式化磁盘%s", m_DiskName);
		break;
	default:
		WriteLog("格式化磁盘%s成功", m_DiskName);
		break;
	}
	FreeLibrary(hInstance);  
	return; 
}




3.关闭磁盘共享


void CDiskOperDlg::OnButtonDelshare()	// 关闭磁盘共享
{
	UpdateData(TRUE);					// 从控件获取数据			
	WCHAR wsz[MAX_PATH];				// 定义Unicode字符数组
	CString disk;						// 定义磁盘共享名称变量	
	disk.Format("%c$", m_DiskName[0]);	// 格式化磁盘共享名称
	wcscpy(wsz, disk.AllocSysString()); // 将共享名称转换到Unicode字符数组
	NET_API_STATUS dwStatus = NetShareDel(NULL,(LPWSTR)wsz,0);	// 关闭磁盘共享
	switch(dwStatus)					// 判断操作返回值,并输出提示信息
	{
	case NERR_Success:
		WriteLog("成功关闭%s磁盘共享\n", disk);
		break;
	case ERROR_ACCESS_DENIED:
		WriteLog("关闭%s磁盘共享错误\n原因=用户没有权限执行此项操作。", disk); 
		break;
	case ERROR_INVALID_PARAMETER:
		WriteLog("关闭%s磁盘共享错误\n原因=参数无效。", disk); 
		break;
	case ERROR_NOT_ENOUGH_MEMORY:
		WriteLog("关闭%s磁盘共享错误\n原因=内存不足。", disk); 
		break;
	case NERR_NetNameNotFound:
		WriteLog("关闭%s磁盘共享错误\n原因=不存在此共享名称。", disk); 
		break;
	default:
		WriteLog("关闭%s磁盘共享错误\n原因=未知。", disk); 
		break;
	}
}



4.设置磁盘卷标

void CDiskOperDlg::OnButtonSetvolum()	// 设置磁盘卷标
{
	UpdateData(TRUE);					// 从控件获取数据
	if (SetVolumeLabel(m_DiskName, "我的系统盘")) // 设置磁盘卷标
		WriteLog("设置%s磁盘卷标成功", m_DiskName);	
	else  WriteLog("设置%s磁盘卷标失败", m_DiskName);
}


5.磁盘碎片整理

void CDiskOperDlg::OnButtonSpzl()	// 磁盘碎片整理
{
	system("defrag E:");
}


6.AT32转换为NTFS



void CDiskOperDlg::OnButtonFat32tontfs() // 从FAT32转换为NTFS
{
	system("convert E: /FS:NTFS");
}



7.隐藏磁盘分区

void CDiskOperDlg::OnButtonHidedisk()	// 隐藏磁盘分区
{	
	UpdateData(TRUE);					// 从控件获取数据
	memset(szPath,0x00, sizeof(szPath));// 初始化路径变量
	CString csDisk;						// 定义磁盘名称
	csDisk.Format("%c:", m_DiskName[0]);// 格式化要隐藏的磁盘名称
	if (QueryDosDeviceA(csDisk, szPath, MAX_PATH) == 0)	// 查询磁盘对应的设备路径
	{
		WriteLog("获取磁盘分区%s路径名失败", csDisk);	// 查询失败,显示结果
		return;							// 查询失败,返回
	}
	if (DefineDosDeviceA(DDD_REMOVE_DEFINITION, csDisk, NULL))	// 删除设备路径名称的定义,即隐藏磁盘分区
		WriteLog("隐藏磁盘分区%s成功。\r\n路径名称=%s", csDisk, szPath);	// 操作成功,显示操作日志
	else
		WriteLog("隐藏磁盘分区%s失败。\r\n路径名称=%s", csDisk, szPath);	// 操作失败,显示操作日志
}


8.隐藏的磁盘分区

void CDiskOperDlg::OnButtonShowdisk()	// 显示被隐藏的磁盘分区
{	
	UpdateData(TRUE);					// 从控件获取数据
	CString csDisk;						// 定义磁盘名称
	csDisk.Format("%c:", m_DiskName[0]);// 格式化要隐藏的磁盘名称
	if (DefineDosDevice(DDD_RAW_TARGET_PATH, csDisk, szPath))	// 增加指定设备路径对应的磁盘名称
		WriteLog("显示被隐藏的磁盘分区%s成功。\r\n路径名称=%s", csDisk, szPath);// 操作成功,显示操作日志
	else
		WriteLog("显示被隐藏的磁盘分区%s失败。\r\n路径名称=%s", csDisk, szPath);// 操作失败,显示操作日志
}


9.更改分区号

void CDiskOperDlg::OnButtonUpdatediskno()	// 更改分区号
{
	UpdateData(TRUE);						// 从控件获取数据
	HMODULE hKernel = GetModuleHandle("kernel32");	// 装载kernel32.dll
	if (hKernel)
	{		
		// 获取GetVolumeNameForVolumeMountPointA函数入口
		PROCGET getAPI = (PROCGET)GetProcAddress(hKernel,"GetVolumeNameForVolumeMountPointA");
		// 获取DeleteVolumeMountPointA函数入口
		PROCDEL delAPI = (PROCDEL)GetProcAddress(hKernel,"DeleteVolumeMountPointA");
		// 获取SetVolumeMountPointA函数入口
		PROCSET setAPI = (PROCSET)GetProcAddress(hKernel,"SetVolumeMountPointA"); 
		char szVolName [MAX_PATH];					// 定义卷名变量
		DWORD dwLen;								// 定义卷名长度变量
		if (!getAPI(m_DiskName, szVolName, &dwLen)) // 查询指定分区的卷名
		{
			WriteLog("查询分区%s的卷名失败。", m_DiskName);	// 显示错误信息
			return;									// 查询失败,返回
		}
		if (!delAPI(m_DiskName))					// 删除卷名对应的分区号
		{
			WriteLog("删除卷名为%s对应的%s分区号。", szVolName, m_DiskName);	// 显示错误信息
			return;									// 删除失败,返回
		}
		if (!setAPI(_T("Z:\\"), szVolName))			// 为卷设置新的分区号为Z
		{
			WriteLog("将卷名为%s的分区号改为Z:失败。", szVolName);	// 显示错误信息
			return;									// 设置失败,返回
		}
		WriteLog("将卷名为%s的分区号改为Z:成功。\r\n原来的分区号=%s", szVolName, m_DiskName);// 显示日志
	}
	else	WriteLog("装载kernel32失败!");			// 显示装载DLL失败信息
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值