xdcysten 发表于 2010-1-16 18:38:44

怎样借助_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

afan 发表于 2010-1-16 20:36:30

看了半天才看明白LZ的意思,汗||
应该不难吧,该有的都有了,凑一下就出来了,你先自己试试,我一会也试试~

xdcysten 发表于 2010-1-16 21:02:51

难是不难,就是思路想不通,想了两个星期了还没想得通,实在想不到希望AFAN版主能帮忙一下。

pusofalse 发表于 2010-1-16 21:11:39

本帖最后由 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
试下这个。

xdcysten 发表于 2010-1-16 21:18:16

试了pusofalse版主的还是不行,h: 盘是移动硬盘还是返回FIXED
c: -> FIXED
d: -> FIXED
e: -> FIXED
f: -> FIXED
h: -> FIXED

pusofalse 发表于 2010-1-16 21:23:51

问题是出在了_WinAPI_GetDriveBusType函数,对于你的移动动盘,它总是不给你返回USB。所以就输出了FIXED。

xdcysten 发表于 2010-1-16 21:29:15

但我这里好像有USB的
C: => ATA
D: => ATA
E: => ATA
F: => ATA
H: => USB

pusofalse 发表于 2010-1-16 21:33:21

本帖最后由 pusofalse 于 2010-1-16 21:34 编辑

- -|||| sorry,是我错了。_WinAPI_GetDriveBusType返回的是一个数字常量,而非直接返回字符串格式的明文数据。已经修改,你看下。

xdcysten 发表于 2010-1-16 21:49:06

多谢版主帮忙,但我想要的是FIXED时只返回

C:
D:
E:
F:

REMOVABLE_DISK时只返回

h:

pusofalse 发表于 2010-1-16 22:10:58

回复 9# xdcysten


    这个我不会,需要你自己来了~

afan 发表于 2010-1-16 22:27:31

本帖最后由 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

xdcysten 发表于 2010-1-17 03:31:36

A版又完成了一道难题,哎俺这些菜鸟还在。。。。。。。。。,感谢A版帮忙。

非典男人 发表于 2010-1-29 18:23:24

收藏 啦:face (37):

ljf840212 发表于 2011-4-1 16:49:16

学习了~{:face (411):}

pvguo 发表于 2012-7-22 19:44:13

学习了,还以为是我的移动硬盘有问题,都是fixed
页: [1] 2
查看完整版本: 怎样借助_WinAPI_GetDriveBusType 分别返回一组固定硬盘和移动硬盘盘符