zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
阅读:2387回复:10

在windows2000下怎么得到一个磁盘的大小

楼主#
更多 发布于:2005-06-15 20:14
在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的容量大小。谢谢了
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于: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
---内核开发合作或提供基础技术服务QQ:22863668 ---
ttmonkey
驱动牛犊
驱动牛犊
  • 注册日期2002-08-09
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
}
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
地板#
发布于: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得到的结果有那么一点点差异。
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-16 16:18

typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER,
  PULARGE_INTEGER, PULARGE_INTEGER);

}

你这个只是得到磁盘剩余容量吧。
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
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就可以了
---内核开发合作或提供基础技术服务QQ:22863668 ---
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
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
你自己算算。
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
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以内的硬盘还没出现过错误。当然这是根据我的需要
---内核开发合作或提供基础技术服务QQ:22863668 ---
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
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了。难道没有人知道,不过是在用户态还是在核心态,只要能获得就行,大家给点建议。
yuanyuan
驱动大牛
驱动大牛
  • 注册日期2003-01-15
  • 最后登录2010-08-04
  • 粉丝0
  • 关注0
  • 积分1025分
  • 威望300点
  • 贡献值0点
  • 好评度232点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-20 13:28
IOCTL_DISK_GET_PARTITION_INFO
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-06-20 15:37
下面是引用yuanyuan于2005-06-20 13:28发表的:
IOCTL_DISK_GET_PARTITION_INFO

好像也不可以吧,得出的大小你算算。
游客

返回顶部