找回密码
 加入
搜索
查看: 3862|回复: 9

如何用au3获取本地硬盘的个数和大小?

  [复制链接]
发表于 2010-1-19 18:10:01 | 显示全部楼层 |阅读模式
本帖最后由 qixinwb 于 2010-1-30 10:56 编辑


我的问题已经解决了。可是这个帖子删不了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 -5 收起 理由
pusofalse -5 问题解决后,非但不加注“已解决”字样,反 ...

查看全部评分

发表于 2010-1-19 18:32:50 | 显示全部楼层
本帖最后由 pusofalse 于 2010-1-19 19:03 编辑
#include <SetupApi.au3>

Dim $hDevs, $tDevIfInfo, $tDevInfo, $sDevicePath, $iMask
Dim $sDescr, $iIndex, $tBuffer, $iPhysSize, $sResult

$tBuffer = DllStructCreate("int64 PhysicalSize")
$iMask = bitOR($DIGCF_PRESENT, $DIGCF_DEVICEINTERFACE)
$hDevs = _SetupDiGetClassDevs($iMask, $GUID_DEVINTERFACE_DISK)

$iMask = bitOR($GENERIC_READ, $GENERIC_WRITE)
While _SetupDiEnumDeviceInterfaces($hDevs, 0, $GUID_DEVINTERFACE_DISK, $iIndex, $tDevIfInfo)
        $iIndex += 1
        $sDevicePath = _SetupDiGetDeviceInterfaceDetail($hDevs, $tDevIfInfo, $tDevInfo)
        $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0xC)
        If $sDescr = "" Then
                $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0)
        EndIf
        $sDevicePath = StringTrimLeft($sDevicePath, 4)
        $sResult &= "Physical Drive #" & _CM_Get_Drive_Disk_Number($sDevicePath) & @Tab
        $hFile = _CM_Create_File("\\?" & $sDevicePath, $iMask, 3, 0, 3, 0)
        _CM_Device_IO_Control($hFile, 0x7405C, 0, 0, $tBuffer, 8)
        _CM_Close_Handle($hFile)
        $iPhysSize = DllStructGetData($tBuffer, "PhysicalSize") / 1024 / 1024
        $sResult &= $sDescr & @Tab & "(" & Round($iPhysSize, 1) & " MB)" & @CRLF
WEnd
_SetupDiApiBufferFree($tBuffer)
_SetupDiApiBufferFree($tDevInfo)
_SetupDiApiBufferFree($tDevIfInfo)
_SetupDiDestroyDeviceInfoList($hDevs)

Msgbox(0, "Physical Drive(s):", $sResult)
SetupApi.au3 - http://www.autoitx.com/forum.php ... &extra=page%3D1
 楼主| 发表于 2010-1-19 18:38:50 | 显示全部楼层
错误: 不能打开包含文件 <SetupApi.au3>
发表于 2010-1-19 18:53:14 | 显示全部楼层
回复 3# qixinwb


    我想你应该先在论坛搜索一下,以"SetupApi.au3"为关键字。
或者,在搜不到的情况下,再看下重新编辑好的2#。
 楼主| 发表于 2010-1-19 19:38:38 | 显示全部楼层
强大的pusofalse !
I 服了 U
无语中。。。。。。。。。。
不知何年何月才能望其项背啊!
 楼主| 发表于 2010-1-19 20:13:58 | 显示全部楼层
感谢pusofalse老大的认真解答。小弟改造了一下,别怪我触犯您的版权哦
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_outfile=本地硬盘信息.exe
#AutoIt3Wrapper_Res_Fileversion=0.0.0.0
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <SetupApi.au3>

Dim $hDevs, $tDevIfInfo, $tDevInfo, $sDevicePath, $iMask
Dim $sDescr, $iIndex, $tBuffer, $iPhysSize, $sResult

$tBuffer = DllStructCreate("int64 PhysicalSize")
$iMask = bitOR($DIGCF_PRESENT, $DIGCF_DEVICEINTERFACE)
$hDevs = _SetupDiGetClassDevs($iMask, $GUID_DEVINTERFACE_DISK)

$iMask = bitOR($GENERIC_READ, $GENERIC_WRITE)
While _SetupDiEnumDeviceInterfaces($hDevs, 0, $GUID_DEVINTERFACE_DISK, $iIndex, $tDevIfInfo)
        $iIndex += 1
        $sDevicePath = _SetupDiGetDeviceInterfaceDetail($hDevs, $tDevIfInfo, $tDevInfo)
        $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0xC)
        If $sDescr = "" Then
                $sDescr = _SetupDiGetDeviceRegistryProperty($hDevs, $tDevInfo, 0)
        EndIf
        $hFile = _CM_Create_File($sDevicePath, $iMask, 3, 0, 3, 0)
        _CM_Device_IO_Control($hFile, 0x7405C, 0, 0, $tBuffer, 8)
        _CM_Close_Handle($hFile)
        $iPhysSize = DllStructGetData($tBuffer, "PhysicalSize") / 1024 / 1024
        $sResult &= $sDescr & @Tab & Round($iPhysSize/954, 1) & " GB" & @CRLF
WEnd
_SetupDiApiBufferFree($tBuffer)
_SetupDiApiBufferFree($tDevInfo)
_SetupDiApiBufferFree($tDevIfInfo)
_SetupDiDestroyDeviceInfoList($hDevs)
IniWrite(@ScriptDir & "\空间.txt", "本地硬盘信息" , "", $sResult )

$cppf = DriveGetDrive("FIXED")
$sum=0
If Not @error Then
        For $i = 1 To $cppf[0]
                Local $pf,$dif
                $begin = TimerInit()
                $pf = $cppf[$i]
                $kj = DriveSpaceTotal($pf & "") /954       
                $dif = TimerDiff($begin)
                                $kjz=Int($kj)
                IniWrite(@ScriptDir & "\空间.txt", "磁盘空间" , $pf & "盘 全部空间为: ", $kjz &"GB")
                                $sum=$sum+$kj
                        Next
                        $sum1=Int($sum)
                        IniWrite(@ScriptDir & "\空间.txt", "磁盘空间" , "全部空间为: ", $sum1 &"GB")
                EndIf
TrayTip("单击确定查看详细数据!","详细数据在此程序目录下的空间.txt中!",30,1)
$var=Msgbox(0, "本地硬盘信息:", $sResult)
If $var=1 Then 
ShellExecute("空间.txt","",@ScriptDir)
EndIf
发表于 2010-1-20 07:20:18 | 显示全部楼层
俺是菜鸟,不会API
#include<array.au3>
$hd=DriveGetDrive("FIXED")
If IsArray($hd) Then
        Local $hdsize[$hd[0]+1][2]
        $hdsize[0][0]=$hd[0]
        For $i=1 To $hd[0]
        $hdsize[$i][0]=        $hd[$i]
        $hdsize[$i][1]=Round(DriveSpaceTotal($hd[$i])/1024,2) &' GB'
        
Next

_ArrayDisplay($hdsize)
EndIf
发表于 2010-1-20 07:48:52 | 显示全部楼层
pusofalse 的代码永远是那么风骚。
发表于 2010-1-20 09:18:53 | 显示全部楼层
pusofalse 的代码永远是那么风骚。
范统.贾 发表于 2010-1-20 07:48



    【传送门:Au3 硬件设备管理UDF - SetupApi.au3
发表于 2010-1-28 18:14:30 | 显示全部楼层
新手一定要多搜索。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-22 13:34 , Processed in 0.083123 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表