184上位机VC MFC判断文件大小是否大于磁盘空间
184上位机VC MFC判断文件大小是否大于磁盘空间 功能展示 大家在安装程序时会发现安装前都会检查安装磁盘空间大小是否满足要求,如果不进行这一步判断侧最终安装会失败,浪费了用户的时间,我们当前也实现判断磁盘空间的功能,<浏览文件>指定一视频文件后,再<移动到>,例程会计算移动到的目标磁盘大小是否大于文件的大小与设置的保留磁盘空间的大小的总和,如果大于,执行移动文件,如果小于不移动文件且提示用户;效果如图; 要点提示 一。指定磁盘大小的获取可以用函数GetDiskFreeSpaceEx()实现,原型为BOOLGetDiskFreeSpaceEx( LPCTSTR lpDirectoryName, // pointer to the directory name PULARGE_INTEGERlpFreeBytesAvailableToCaller, //receives the number of bytes on // disk available to the caller PULARGE_INTEGERlpTotalNumberOfBytes, //receives the number of bytes on disk PULARGE_INTEGERlpTotalNumberOfFreeBytes //receives the free bytes on disk ); 返回值Long,非零表示成功,零表示失败。会设置GetLastError lpRootPathName String,不包括卷名的磁盘根路径名 lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量 lpTotalNumberOfBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上的总字节数 lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数 二。指定大文件的大小获取可以用函数stat()此函数的使用得添加其所在头文件#include<sys\stat.h> 实现功能 1.新建基于对话框的应用程序 2.拖拽一列表控件ID为IDC_LIST1用于显示当前系统全部磁盘大小 ; 拖拽两编辑框ID为IDC_EDIT1及IDC_EDIT2,分别用于显示要移动文件的路径和要设置保留磁盘空间的大小 ; 拖拽两按钮<浏览文件><移动到>实现要移动文件的浏览及移动文件功能; 3.添加变量CImageList m_ImgList;用于显示磁盘图标,在OnInitDialog()初始化 - //<>
- m_ImgList.Create(16,16,ILC_COLOR32|ILC_MASK,0,0);
- m_ImgList.Add(::AfxGetApp()->LoadIcon(IDI_DISK));
-
- CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
- pListCtrl->ModifyStyle(0,LVS_REPORT,0);
- pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES);
- pListCtrl->SetImageList(&m_ImgList,LVSIL_SMALL);
- pListCtrl->InsertColumn(0,"磁盘驱动器",LVCFMT_LEFT,150);
- pListCtrl->InsertColumn(1,"驱动器大小",LVCFMT_LEFT,150);
- pListCtrl->InsertColumn(2,"可用空间",LVCFMT_LEFT,150);
- //><
- DWORD size=::GetLogicalDriveStrings(0,NULL);
- if(size!=0)
- {
- HANDLE heap=::GetProcessHeap();
- LPSTR lp=(LPSTR)HeapAlloc(heap,HEAP_ZERO_MEMORY,size*sizeof(TCHAR));
- ::GetLogicalDriveStrings(size*sizeof(TCHAR),lp);
- int i=0;
-
复制代码- while(*lp!=0)
- {
- pListCtrl->InsertItem(i,lp,0);
- lp=_tcschr(lp,0)+1;
- i++;
- }
- }
- ULARGE_INTEGER totalsize;
- ULARGE_INTEGER freesize;
- ULARGE_INTEGER availablesize;
- int num=pListCtrl->GetItemCount();
- for(int i=0;i<num;i++)
- {
- CString str,temp;
- str=pListCtrl->GetItemText(i,0);
- ::GetDiskFreeSpaceEx(str,&freesize,&totalsize,&availablesize);
- temp.Format("%ldM",totalsize.QuadPart/1048576);//字节B转MB
- pListCtrl->SetItemText(i,1,temp);
-
- temp.Format("%ldM",freesize.QuadPart/1048576);
- pListCtrl->SetItemText(i,2,temp);
- }
复制代码4两按钮代码的实现 - void CGkbc8Dlg::OnExplor()
- {
- CFileDialog Dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL);
- if(IDOK == Dlg.DoModal())
- {
- SetDlgItemText(IDC_EDIT1,Dlg.GetPathName());
- }
- }
- void CGkbc8Dlg::OnMove()
- {
- char buf[MAX_PATH];
- ZeroMemory(buf,MAX_PATH);
- BROWSEINFO bif;
- bif.hwndOwner=GetSafeHwnd();
- bif.iImage = 0;
-
复制代码- bif.lParam=0;
- bif.lpfn=NULL;
- bif.lpszTitle="选择文件夹";
- bif.pidlRoot = 0;
- bif.pszDisplayName=buf;
- bif.ulFlags=BIF_EDITBOX;
- LPITEMIDLIST pIil=NULL;
- pIil=SHBrowseForFolder(&bif);
- if(pIil == NULL) return;
- SHGetPathFromIDList(pIil,buf);
- CString sDiskName(buf);
- //计算磁盘可用空间大小
- ULARGE_INTEGER totalsize;
- ULARGE_INTEGER freesize;
- ULARGE_INTEGER availablesize;
- ::GetDiskFreeSpaceEx(sDiskName.Left(sDiskName.Find('\\')+1),&freesize,&totalsize,&availablesize);
- CString sFilePath;
- GetDlgItemText(IDC_EDIT1,sFilePath);
- unsigned long nSize=0;
- int nRemain = GetDlgItemInt(IDC_EDIT2);//保留磁盘空间大小
- nSize = get_file_size(sFilePath)/1048576+nRemain;
- if(nSize>freesize.QuadPart/1048576) AfxMessageBox("磁盘空间不足");
- else//执行移动文件
- {
- sDiskName+=sFilePath.Right(sFilePath.GetLength()-sFilePath.ReverseFind('\\')-1);
- ::MoveFile(sFilePath,sDiskName);
- }
- }
复制代码我们发现两按钮的代码里调用了一自定义函数get_file_size()所以别忘了复制使用此函数; 我们来演示整个功能实现 过程
|