标题: [求助]获取驱动器信息,有什么办法不出现提示信息?
[打印本页]
作者: devang
时间: 2010-9-2 23:36
标题: [求助]获取驱动器信息,有什么办法不出现提示信息?
DOS6.2 + BC3.1
实际项目中是图形界面,drive=0,1 时(A:,B:),_chdrivee有效,
但_dos_getdiskfree出错,应该是在执行21号中断是提示出错信息(General failure reaing drive A),破坏图形环境。
另外用 DUSE49 加载驱动参数为 drivers=3,则后两个盘符也会提示出错信息(Invalid unit reading drive F)。
Windows XP 下执行是光驱和虚拟光驱报错。
有什么办法不出现提示信息?自己知道这个驱动器不能用就行了。
代码如下:
C/C++ code
// crt_getdrive.c
// compile with: /c
// Illustrates drive functions including:
// _getdrive _chdrive _getdcwd
//
#include <dos.h>
#include <stdio.h>
#include <direct.h>
#include <stdlib.h>
#include <ctype.h>
int main( void )
{
int ch, drive, curdrive;
long LM;
static char path[_MAX_PATH];
struct diskfree_t diskspace;
curdrive = _getdrive(); // Save current drive.
for( drive = 1; drive <= 26; drive++ ) // If we can switch to the drive, it exists.
{
if( !_chdrive( drive ) )
{
printf( "%c:", drive + 'A' - 1 );
if( _getdcwd( drive, path, _MAX_PATH ) != NULL )
printf( " (Current directory is %s)", path );
if(0==_dos_getdiskfree(drive,&diskspace))
{
LM=(unsigned long)(diskspace.avail_clusters)
*(unsigned long)(diskspace.sectors_per_cluster)
*(unsigned long)(diskspace.bytes_per_sector)/1024/1024;
printf( " %ld MBytes free",LM);
}
putchar( '\n' );
}
}
_chdrive( curdrive ); // Restore original drive.
}
作者: devang
时间: 2010-9-2 23:39
标题: MSDN上查到合适的例子,不能在纯DOS下执行
// crt_getdiskfree.c
// compile with: /c
#include <windows.h>
#include <direct.h>
#include <stdio.h>
#include <tchar.h>
TCHAR g_szBorder[] = _T("======================================================================\n");
TCHAR g_szTitle1[] = _T("|DRIVE|TOTAL CLUSTERS|AVAIL CLUSTERS|SECTORS / CLUSTER|BYTES / SECTOR|\n");
TCHAR g_szTitle2[] = _T("|=====|==============|==============|=================|==============|\n");
TCHAR g_szLine[] = _T("| A: | | | | |\n");
void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uVal);
int main(int argc, char* argv[]) {
TCHAR szMsg[4200];
struct _diskfree_t df = {0};
ULONG uDriveMask = _getdrives();
unsigned uErr, uLen, uDrive;
printf(g_szBorder);
printf(g_szTitle1);
printf(g_szTitle2);
for (uDrive=1; uDrive<=26; ++uDrive) {
if (uDriveMask & 1) {
uErr = _getdiskfree(uDrive, &df);
memcpy(szMsg, g_szLine, sizeof(g_szLine));
szMsg[3] = uDrive + 'A' - 1;
if (uErr == 0) {
utoiRightJustified(szMsg+8, szMsg+19, df.total_clusters);
utoiRightJustified(szMsg+23, szMsg+34, df.avail_clusters);
utoiRightJustified(szMsg+38, szMsg+52, df.sectors_per_cluster);
utoiRightJustified(szMsg+56, szMsg+67, df.bytes_per_sector);
}
else {
uLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
uErr, 0, szMsg+8, 4100, NULL);
szMsg[uLen+6] = ' ';
szMsg[uLen+7] = ' ';
szMsg[uLen+8] = ' ';
}
printf(szMsg);
}
uDriveMask >>= 1;
}
printf(g_szBorder);
}
void utoiRightJustified(TCHAR* szLeft, TCHAR* szRight, unsigned uVal) {
TCHAR* szCur = szRight;
int nComma = 0;
if (uVal) {
while (uVal && (szCur >= szLeft)) {
if (nComma == 3) {
*szCur = ',';
nComma = 0;
}
else {
*szCur = (uVal % 10) | 0x30;
uVal /= 10;
++nComma;
}
--szCur;
}
}
else {
*szCur = '0';
--szCur;
}
if (uVal) {
szCur = szLeft;
while (szCur <= szRight) {
*szCur = '*';
++szCur;
}
}
}
结果如下,中间未提示错误信息,这样就好
======================================================================
|DRIVE|TOTAL CLUSTERS|AVAIL CLUSTERS|SECTORS / CLUSTER|BYTES / SECTOR|
|=====|==============|==============|=================|==============|
| C: | 7,681,070 | 5,276,989 | 8 | 512 |
| D: | 23,041,218 | 18,417,512 | 8 | 512 |
| E: | 23,041,218 | 16,398,257 | 8 | 512 |
| F: | 21,818,270 | 2,858,339 | 8 | 512 |
| G: | 2,560,351 | 2,543,733 | 8 | 512 |
| H: | 设备未就绪。 | | |
| I: | 设备未就绪。 | | |
======================================================================