WEB开发网
开发学院软件开发VC 实现操作过程提示对话框 阅读

实现操作过程提示对话框

 2010-07-11 20:43:36 来源:WEB开发网   
核心提示:如何得到并修改各驱动器的信息在设计和文件输入/ 输出有关的应用程序时,我们很可能在输入/ 输出文件前,实现操作过程提示对话框(5),需要了解一下源驱动器或者目标驱动器的各项信息,比如是否有磁盘在软驱中,在第二个参数中指明新的卷标号,例如,它是否已打开写保护,以及现有磁盘的容量等

如何得到并修改各驱动器的信息

在设计和文件输入/ 输出有关的应用程序时,我们很可能在输入/ 输出文件前,需要了解一下源驱动器或者目标驱动器的各项信息,比如是否有磁盘在软驱中,它是否已打开写保护,以及现有磁盘的容量等。遗憾的是,MFC 类库中没有提供支持这些功能的类,所以我们只能通过Win32 提供的函数来完成我们的要求。下面,我根据自己的编程实践,通过几段程序,来说明如何利用Win32 提供的函数实现对驱动器的操作。读者可以根据自己的需要,把介绍的函数稍加修改后,即可插入到自己设计的应用程序中去。下面程序的功能是搜索计算机中所有驱动器,选择出其中软盘驱动器的驱动器号,依次加入到一个下拉列表框中。

void FindDriverInfo()
{
CComboBox* Driver=(CComboBox*)GetDlgItem(IDC_DRIVER);
DWORD dwNumBytesForDriveStrings;
HANDLE hHeap;
LPSTR lp;
CString strLogdrive;
int nNumDrives=0, nDriveNum;
dwNumBytesForDriveStrings=GetLogicalDriveStrings(0,NULL)
*sizeof(TCHAR);//实际存储驱动器号的字符串长度
if (dwNumBytesForDriveStrings!=0) {
hHeap=GetProcessHeap();
lp=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,
dwNumBytesForDriveStrings);//
GetLogicalDriveStrings(HeapSize(hHeap,0,lp),lp);
StringBox.SetSize(dwNumBytesForDriveStrings/sizeof(TCHAR)+1);
while (*lp!=0) {
if (GetDriveType(lp)==DRIVE_REMOVABLE){
Driver->AddString(lp);
StringBox[nNumDrives]=lp;
nNumDrives++;
}
lp=_tcschr(lp,0)+1;
}
}
else AfxMessageBox("Can't Use The Function GetLogicalDriveStrings!");

}

下面介绍的EmptyDiskSpace() 函数主要负责清空指定驱动器中的磁盘,同时它还负责记录指定驱动器中磁盘的容量,并得到该磁盘的序列号。在该函数中,还将调用第七部分提到的PreRemoveDirectory() 函数,来完成清空工作。

BOOL EmptyDiskSpace(CString Driver)
{
BOOL result=TRUE;
DWORDSectorsPerCluster; // address of sectors per cluster
DWORDBytesPerSector; // address of bytes per sector
DWORDNumberOfFreeClusters; // address of number of free clusters
DWORDTotalNumberOfClusters;
DWORDTotalBytes;
DWORDFreeBytes;
int bContinue=1;
char DiskVolumeSerialNumber[30];
//存储驱动器内当前磁盘的序列号
LPCTSTRlpRootPathName;
// address of root directory of the file system
LPTSTRlpVolumeNameBuffer=new char[12];
// address of name of the volume
DWORDnVolumeNameSize=12;
// length of lpVolumeNameBuffer
DWORD VolumeSerialNumber;
// address of volume serial number
DWORD MaximumComponentLength;
// address of system's maximum filename length
DWORD FileSystemFlags;
// address of file system flags
LPTSTRlpFileSystemNameBuffer=new char[10];
// address of name of file system
DWORDnFileSystemNameSize=10;
// length of lpFileSystemNameBuffer
lpRootPathName=Driver;
while (1){
if (GetDiskFreeSpace(Driver, &SectorsPerCluster,
&BytesPerSector, &NumberOfFreeClusters,
&TotalNumberOfClusters))
{//驱动器中有磁盘
TotalBytes=SectorsPerCluster*BytesPerSector
*TotalNumberOfClusters;//磁盘总容量
FreeBytes=SectorsPerCluster*BytesPerSector
*NumberOfFreeClusters;//磁盘空闲空间容量
GetVolumeInformation(lpRootPathName,
lpVolumeNameBuffer, nVolumeNameSize,
&VolumeSerialNumber,
&MaximumComponentLength,
&FileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize);
sprintf(DiskVolumeSerialNumber,"%X",VolumeSerialNumber);
//得到驱动器内当前磁盘的序列号
SetmTotalBytes(TotalBytes/1024);//存储指定驱动器中磁盘的容量
if (TotalBytes!=FreeBytes){//当磁盘总容量不等于空闲空间容量时,
应该执行清空操作
while (bContinue) {
if ((bContinue==2)||(MessageBox
("在驱动器"+m_Driver+"中的磁盘尚存有数据.
n您愿意让系统为您删除它们吗?",
"提问",MB_YESNO|MB_ICONQUESTION)==IDYES))
if (!PreRemoveDirectory(Driver))//无法执行清空操作
if (MessageBox("因某种原因系统无法删除
在驱动器"+m_Driver+"中的磁盘上的数据.
n请检查磁盘是否没有关闭写保护.
n您愿意再试一次吗?",
"问题",MB_YESNO|MB_ICONERROR)==IDYES) {
bContinue=2;
continue;
}
else {
bContinue=0;
result=FALSE;
}
else {
MessageBox("成功删除磁盘上的数据!",
"提示信息",MB_OK|MB_ICONINFORMATION);
bContinue=0;
result=TRUE;
}
else {//THE FIRST IF'S ELSE
bContinue=0;
result=FALSE;
}
}
}
else result=TRUE;
break;
}
else {
if (MessageBox("没有磁盘在驱动器"+m_Driver+"中.
n您愿意插入一张磁盘再来一次吗?",
"问题",MB_YESNO|MB_ICONASTERISK)==IDYES) continue;
else break;
}
}//END OF WHILE
return result;
}

在MS-DOS 和Windows95 中,磁盘卷标最多由11 个字符组成,并且字母的大小写不加区分。当需要设定指定驱动器中磁盘的卷标时,只要调用Win32的SetVolumeLabel() 函数即可,并在第一个参数中指明磁盘所在的驱动器号,在第二个参数中指明新的卷标号。例如,SetVolumeLabel(DriverNum,NewVolumeLabel)。

上一页  1 2 3 4 5 

Tags:实现 操作 过程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接