怎样借助_WinAPI_GetDriveBusType 分别返回一组固定硬盘和移动硬盘盘符
本帖最后由 xdcysten 于 2010-1-17 03:34 编辑上次提问了一个“DriveGetDrive怎样返回一组没有移动硬盘盘符的数组”,可惜最后还没有解决
例:假如本地有固定硬盘盘符4个分别为:C: D: E: F: 移动硬盘盘符这个有时候会发生一此变化有时是 H: 也可能是 I:
怎样可以像DriveGetDrive ( "类型" )那样使用_DriveGetDrive ( "REMOVABLE_DISK" ) 返回移动硬盘盘符数组
使用_DriveGetDrive ( "FIXED" ) 只 返回固定硬盘盘符数组不包含移动硬盘盘符的数组
如下:_DriveGetDrive ( "REMOVABLE_DISK" ) 返回像DriveGetDrive得到的数组 H:
_DriveGetDrive ( "FIXED" ) 返回像DriveGetDrive得到的数组 C: D: E: F:
_WinAPI_GetDriveBusType 可以返回以盘符 => 类型#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global $Bus, $Text, $Drive = DriveGetDrive('FIXED')
For $i = 1 To $Drive
$Bus = _WinAPI_GetDriveBusType($Drive[$i])
Switch $Bus
Case $DRIVE_BUS_TYPE_UNKNOWN
$Text = 'UNKNOWN'
Case $DRIVE_BUS_TYPE_SCSI
$Text = 'SCSI'
Case $DRIVE_BUS_TYPE_ATAPI
$Text = 'ATAPI'
Case $DRIVE_BUS_TYPE_ATA
$Text = 'ATA'
Case $DRIVE_BUS_TYPE_1394
$Text = '1394'
Case $DRIVE_BUS_TYPE_SSA
$Text = 'SSA'
Case $DRIVE_BUS_TYPE_FIBRE
$Text = 'FIBRE'
Case $DRIVE_BUS_TYPE_USB
$Text = 'USB'
Case $DRIVE_BUS_TYPE_RAID
$Text = 'RAID'
Case $DRIVE_BUS_TYPE_ISCSI
$Text = 'ISCSI'
Case $DRIVE_BUS_TYPE_SAS
$Text = 'SAS'
Case $DRIVE_BUS_TYPE_SATA
$Text = 'SATA'
Case $DRIVE_BUS_TYPE_SD
$Text = 'SD'
Case $DRIVE_BUS_TYPE_MMC
$Text = 'MMC'
EndSwitch
ConsoleWrite(StringUpper($Drive[$i]) & ' => ' & $Text & @CR)
NextC: => ATA
D: => ATA
E: => ATA
F: => ATA
H: => USB
由于论坛下载附件的金钱有些过高,可能对于一个学习者是好的,因为您得回复帖子才有金钱去下载论坛附件,这也是一种美德。
但对于一个提问者来说就不是一件好事了,因为没有多少个人愿意去回复你的问题而还要浪费那30块 去下载你问题中的代码。
为了不浪费网友的金钱我提取了WinAPIEx.au3其中需要的代码出来如下:#Include-once
#Include <WinAPI.au3>
Global Const $DRIVE_BUS_TYPE_UNKNOWN = 0x00
Global Const $DRIVE_BUS_TYPE_SCSI = 0x01
Global Const $DRIVE_BUS_TYPE_ATAPI = 0x02
Global Const $DRIVE_BUS_TYPE_ATA = 0x03
Global Const $DRIVE_BUS_TYPE_1394 = 0x04
Global Const $DRIVE_BUS_TYPE_SSA = 0x05
Global Const $DRIVE_BUS_TYPE_FIBRE = 0x06
Global Const $DRIVE_BUS_TYPE_USB = 0x07
Global Const $DRIVE_BUS_TYPE_RAID = 0x08
Global Const $DRIVE_BUS_TYPE_ISCSI = 0x09
Global Const $DRIVE_BUS_TYPE_SAS = 0x0A
Global Const $DRIVE_BUS_TYPE_SATA = 0x0B
Global Const $DRIVE_BUS_TYPE_SD = 0x0C
Global Const $DRIVE_BUS_TYPE_MMC = 0x0D
Func _WinAPI_GetDriveBusType($sDrive)
Local $hFile = _WinAPI_CreateFile('\\.\' & $sDrive, 2, 0, 0)
If $hFile = 0 Then
Return SetError(1, 0, -1)
EndIf
Local $tSTORAGE_PROPERTY_QUERY = DllStructCreate('dword;dword;byte')
Local $tSTORAGE_DEVICE_DESCRIPTOR = DllStructCreate('ulong;ulong;byte;byte;byte;byte;ulong;ulong;ulong;ulong;dword;ulong;byte')
Local $Ret = DllCall('kernel32.dll', 'int', 'DeviceIoControl', 'ptr', $hFile, 'dword', 0x002D1400, 'ptr', DllStructGetPtr($tSTORAGE_PROPERTY_QUERY), 'dword', DllStructGetSize($tSTORAGE_PROPERTY_QUERY), 'ptr', DllStructGetPtr($tSTORAGE_DEVICE_DESCRIPTOR), 'dword', DllStructGetSize($tSTORAGE_DEVICE_DESCRIPTOR), 'dword*', 0, 'ptr', 0)
If (@error) Or ($Ret = 0) Then
$Ret = 0
EndIf
_WinAPI_FreeHandle($hFile)
If Not IsArray($Ret) Then
Return SetError(2, 0, -1)
EndIf
Return SetError(0, 0, DllStructGetData($tSTORAGE_DEVICE_DESCRIPTOR, 11))
EndFunc ;==>_WinAPI_GetDriveBusType
Func _WinAPI_FreeHandle($hObject)
Local $Ret = DllCall('kernel32.dll', 'int', 'CloseHandle', 'ptr', $hObject)
If (@error) Or ($Ret = 0) Then
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_FreeHandle 看了半天才看明白LZ的意思,汗||
应该不难吧,该有的都有了,凑一下就出来了,你先自己试试,我一会也试试~ 难是不难,就是思路想不通,想了两个星期了还没想得通,实在想不到希望AFAN版主能帮忙一下。 本帖最后由 pusofalse 于 2010-1-16 21:33 编辑
#include <WinAPIEx.au3>
$aDrive = DriveGetDrive("All")
For $i = 1 To $aDrive
ConsoleWrite($aDrive[$i] & " -> ")
$sType = DriveGetType($aDrive[$i])
If $sType <> "FIXED" Then
ContinueLoop ConsoleWrite($sType & @CRLF) * 0 + 1
EndIf
If _WinAPI_GetDriveBusType($aDrive[$i]) = 7 Then
ConsoleWrite("REMOVABLE_DISK")
Else
ConsoleWrite("FIXED")
EndIf
ConsoleWrite(@CRLF)
Next
试下这个。 试了pusofalse版主的还是不行,h: 盘是移动硬盘还是返回FIXED
c: -> FIXED
d: -> FIXED
e: -> FIXED
f: -> FIXED
h: -> FIXED 问题是出在了_WinAPI_GetDriveBusType函数,对于你的移动动盘,它总是不给你返回USB。所以就输出了FIXED。 但我这里好像有USB的
C: => ATA
D: => ATA
E: => ATA
F: => ATA
H: => USB 本帖最后由 pusofalse 于 2010-1-16 21:34 编辑
- -|||| sorry,是我错了。_WinAPI_GetDriveBusType返回的是一个数字常量,而非直接返回字符串格式的明文数据。已经修改,你看下。 多谢版主帮忙,但我想要的是FIXED时只返回
C:
D:
E:
F:
REMOVABLE_DISK时只返回
h: 回复 9# xdcysten
这个我不会,需要你自己来了~ 本帖最后由 afan 于 2010-1-17 12:56 编辑
回复xdcysten
这个我不会,需要你自己来了~
pusofalse 发表于 2010-1-16 22:10 http://www.autoitx.com/images/common/back.gif
超版又出题了,哈~
To LZ: 此题已经有答案了,貌似LZ还没理清头绪~#include <WinAPIEx.au3>
#include<Array.au3>
$test = _DriveGetDrive('FIXED') ;返回本地硬盘
_ArrayDisplay($test, '本地硬盘')
$test = _DriveGetDrive('FIXED', 0) ;返回USB移动硬盘
_ArrayDisplay($test, 'USB移动硬盘')
Func _DriveGetDrive($type, $flag = 1)
;$flag = 1 返回本地设备;$flag = 0 返回USB移动设备
Local $aDisk = , $i
Local $aDrive = DriveGetDrive($type)
For $i = 1 To $aDrive
If $flag = 0 And _WinAPI_GetDriveBusType($aDrive[$i]) = 7 Then
_ArrayAdd($aDisk, StringUpper($aDrive[$i]))
$aDisk += 1
ElseIf $flag = 1 And _WinAPI_GetDriveBusType($aDrive[$i]) <> 7 Then
_ArrayAdd($aDisk, StringUpper($aDrive[$i]))
$aDisk += 1
EndIf
Next
Return $aDisk
EndFunc ;==>_DriveGetDrive A版又完成了一道难题,哎俺这些菜鸟还在。。。。。。。。。,感谢A版帮忙。 收藏 啦:face (37): 学习了~{:face (411):} 学习了,还以为是我的移动硬盘有问题,都是fixed
页:
[1]
2