阅读:2387回复:10
在windows2000下怎么得到一个磁盘的大小
在xp和2003下可以用IOCTL_DISK_GET_LENGTH_INFO得到,这个命令在2000下没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX在2000下也没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。不知道从2000下面怎么得到?从用户态和核心态都行,只要能得到磁盘的大小。就是一个PhysicalDrive的容量大小。谢谢了
|
|
驱动老牛
![]() |
沙发#
发布于:2005-06-16 09:31
在xp和2003下可以用IOCTL_DISK_GET_LENGTH_INFO得到,这个命令在2000下没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX在2000下也没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。不知道从2000下面怎么得到?从用户态和核心态都行,只要能得到磁盘的大小。就是一个PhysicalDrive的容量大小。谢谢了 IOCTL_DISK_GET_DRIVE_GEOMETRY |
|
板凳#
发布于:2005-06-16 13:49
typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER); LONGLONG GetDiskAvailableSpace(TCHAR *tcDisk) { BOOL fResult = FALSE; DWORD dwSectPerClust= 0, dwBytesPerSect= 0,dwFreeClusters= 0,dwTotalClusters= 0; LONGLONG i64FreeBytesToCaller= 0,i64TotalBytes= 0,i64FreeBytes = 0; P_GDFSE pGetDiskFreeSpaceEx = NULL; if(lstrlen(tcDisk)<=0) return 0; //获取函数地址 pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress ( GetModuleHandle (_T(\"kernel32.dll\")), \"GetDiskFreeSpaceExW\"); if (pGetDiskFreeSpaceEx) { fResult = pGetDiskFreeSpaceEx (tcDisk, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes); if (fResult) { return i64FreeBytes; } } else { fResult = GetDiskFreeSpace (tcDisk, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters); if (fResult) { i64FreeBytes = (__int64)dwFreeClusters * dwSectPerClust * dwBytesPerSect; return i64FreeBytes; } } return i64FreeBytes; } |
|
地板#
发布于:2005-06-16 15:47
[quote]在xp和2003下可以用IOCTL_DISK_GET_LENGTH_INFO得到,这个命令在2000下没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX在2000下也没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。不知道从2000下面怎么得到?从用户态和核心态都行,只要能得到磁盘的大小。就是一个PhysicalDrive的容量大小。谢谢了 IOCTL_DISK_GET_DRIVE_GEOMETRY [/quote] IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。 |
|
地下室#
发布于:2005-06-16 16:18
你这个只是得到磁盘剩余容量吧。 |
|
驱动老牛
![]() |
5楼#
发布于:2005-06-16 18:19
[quote][quote]在xp和2003下可以用IOCTL_DISK_GET_LENGTH_INFO得到,这个命令在2000下没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX在2000下也没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。不知道从2000下面怎么得到?从用户态和核心态都行,只要能得到磁盘的大小。就是一个PhysicalDrive的容量大小。谢谢了 IOCTL_DISK_GET_DRIVE_GEOMETRY [/quote] IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。 [/quote] 我也发现过,导致在将一个硬盘映射成另一个硬盘的时候不能用比较怪异。后来乘个1024/1000就可以了 |
|
6楼#
发布于:2005-06-17 10:02
在xp和2003下可以用我也发现过,导致在将一个硬盘映射成另一个硬盘的时候不能用比较怪异。后来乘个1024/1000就可以了 不对吧,怎么可能×1024/1000就可以呢? 我用IOCTL_DISK_GET_LENGTH_INFO得到一个磁盘大小为268435456,用IOCTL_DISK_GET_DRIVE_GEOMETRY得到一个磁盘大小为: 32(柱面)×255(磁道)×63(扇区)×512(扇区大小)=263208960 你自己算算。 |
|
驱动老牛
![]() |
7楼#
发布于:2005-06-17 10:56
[quote]在xp和2003下可以用我也发现过,导致在将一个硬盘映射成另一个硬盘的时候不能用比较怪异。后来乘个1024/1000就可以了 不对吧,怎么可能×1024/1000就可以呢? 我用IOCTL_DISK_GET_LENGTH_INFO得到一个磁盘大小为268435456,用IOCTL_DISK_GET_DRIVE_GEOMETRY得到一个磁盘大小为: 32(柱面)×255(磁道)×63(扇区)×512(扇区大小)=263208960 你自己算算。 [/quote] 不对是肯定的,因为1024/1000这样算是毫无道理的,但是我这样做只是更接近些,至少200G以内的硬盘还没出现过错误。当然这是根据我的需要 |
|
8楼#
发布于:2005-06-17 14:35
在xp和2003下可以用IOCTL_DISK_GET_LENGTH_INFO得到,这个命令在2000下没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX在2000下也没有用,IOCTL_DISK_GET_DRIVE_GEOMETRY有用,但是把柱面×磁道×扇区×扇区大小得到的结果和从IOCTL_DISK_GET_LENGTH_INFO得到的结果有那么一点点差异。不知道从2000下面怎么得到?从用户态和核心态都行,只要能得到磁盘的大小。就是一个PhysicalDrive的容量大小。谢谢了 难道在windows 2000下不能得到磁盘的准确大小,那也太ft了。难道没有人知道,不过是在用户态还是在核心态,只要能获得就行,大家给点建议。 |
|
9楼#
发布于:2005-06-20 13:28
IOCTL_DISK_GET_PARTITION_INFO
|
|
10楼#
发布于:2005-06-20 15:37
下面是引用yuanyuan于2005-06-20 13:28发表的: 好像也不可以吧,得出的大小你算算。 |
|