ドライブのサイズを計算する方法は3つ有ります 1.GetDiskFreeSpaceExを使う(NT,95 OSR2,98でのみ有効) 2.GetDiskFreeSpaceを使う 3._getdiskfreeを使う 上から順に使っていけば間違いないと思います. ただし,ネットワークドライブ\\Domain\DriveName で見ているドライブの容量は調べることができません. GetDiskFreeSpaceExを使うことによって2GByte以上のドライブを見ることができますが なぜかKERNEL32.DLLからLoadLibraryとGetProcAddressを使用して読み込まなくてはいけませんでした. //仮にCドライブを調べてみます CHAR DriveName[10]="C:"; //検索するドライブ名 if(DriveName[0]=='\\') return 0; //GetDiskFreeSpaceExでFAT32のディレクトリを調べる //GetDiskFreeSpaceExのCallBack関数の宣言 //NTの場合はKERNEL32.DLLのGetDiskFreeSpaceExW //95 OSR2および98の場合はGetDiskFreeSpaceExAなので共通化するために //CallBack関数にしています typedef BOOL (CALLBACK* LP_GETDISKFREESPACEEX)(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); LP_GETDISKFREESPACEEX lpGetDiskFreeSpaceEx; //OSのバージョンを調べる OSVERSIONINFO OsVerInfo; OsVerInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx(&OsVerInfo); LONG BuildNumber=(OsVerInfo.dwBuildNumber&0xffff); HINSTANCE hDriveSpace; ULARGE_INTEGER FreeBytesAvailableToCaller; ULARGE_INTEGER TotalNumberOfBytes; ULARGE_INTEGER TotalNumberOfFreeBytes; //Windows NTの場合 if(OsVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT) { hDriveSpace=LoadLibrary("KERNEL32.DLL"); if(hDriveSpace!=NULL) { lpGetDiskFreeSpaceEx=(LP_GETDISKFREESPACEEX)GetProcAddress(hDriveSpace,(LPSTR)"GetDiskFreeSpaceExW"); if(lpGetDiskFreeSpaceEx!=NULL) { if(lpGetDiskFreeSpaceEx(DriveName,&FreeBytesAvailableToCaller,&TotalNumberOfBytes, &TotalNumberOfFreeBytes)) { FreeLibrary(hDriveSpace); return TotalNumberOfBytes.QuadPart; } } FreeLibrary(hDriveSpace); } } else //Windows 95 OSR 2 Windows 98の場合 { hDriveSpace=LoadLibrary("KERNEL32.DLL"); if(hDriveSpace!=NULL) { lpGetDiskFreeSpaceEx=(LP_GETDISKFREESPACEEX)GetProcAddress(hDriveSpace,(LPSTR)"GetDiskFreeSpaceExA"); if(lpGetDiskFreeSpaceEx!=NULL) { if(lpGetDiskFreeSpaceEx(DriveName,&FreeBytesAvailableToCaller,&TotalNumberOfBytes, &TotalNumberOfFreeBytes)) { FreeLibrary(hDriveSpace); return TotalNumberOfBytes.QuadPart; } } FreeLibrary(hDriveSpace); } } //WIN32 APIで確保 DWORD dwSectorsPerCluster,dwBytesPerSector,dwFreeClusters,dwClusters; if(GetDiskFreeSpace(DriveName,&dwSectorsPerCluster,&dwBytesPerSector, &dwFreeClusters,&dwClusters)) { LONGLONG TotalBytes; TotalBytes=((LONGLONG)dwSectorsPerCluster)*((LONGLONG)dwBytesPerSector)* ((LONGLONG)dwClusters); return TotalBytes; } //DOS関数で確保 unsigned DiskNumber; struct diskfree_t DiskFree; else DiskNumber=DriveName[0]-'A'+1; if(_getdiskfree(DiskNumber,&DiskFree)==0) { LONGLONG TotalBytes; TotalBytes=((LONGLONG)DiskFree.sectors_per_cluster)*((LONGLONG)DiskFree.bytes_per_sector) *((LONGLONG)DiskFree.total_clusters); return TotalBytes; } return 0;