找回密码
 加入
搜索
查看: 6158|回复: 16

怎样借助_WinAPI_GetDriveBusType 分别返回一组固定硬盘和移动硬盘盘符

 火.. [复制链接]
发表于 2010-1-16 18:38:44 | 显示全部楼层 |阅读模式
本帖最后由 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[0]
        $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)
Next
C: => 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[4]')
        Local $tSTORAGE_DEVICE_DESCRIPTOR = DllStructCreate('ulong;ulong;byte;byte;byte;byte;ulong;ulong;ulong;ulong;dword;ulong;byte[512]')
        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] = 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] = 0) Then
                Return SetError(1, 0, 0)
        EndIf
        Return 1
EndFunc   ;==>_WinAPI_FreeHandle

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-1-16 20:36:30 | 显示全部楼层
看了半天才看明白LZ的意思,汗||
应该不难吧,该有的都有了,凑一下就出来了,你先自己试试,我一会也试试~
 楼主| 发表于 2010-1-16 21:02:51 | 显示全部楼层
难是不难,就是思路想不通,想了两个星期了还没想得通,实在想不到希望AFAN版主能帮忙一下。
发表于 2010-1-16 21:11:39 | 显示全部楼层
本帖最后由 pusofalse 于 2010-1-16 21:33 编辑
#include <WinAPIEx.au3>

$aDrive = DriveGetDrive("All")

For $i = 1 To $aDrive[0]
        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
试下这个。
 楼主| 发表于 2010-1-16 21:18:16 | 显示全部楼层
试了pusofalse版主的还是不行,h: 盘是移动硬盘还是返回FIXED
c: -> FIXED
d: -> FIXED
e: -> FIXED
f: -> FIXED
h: -> FIXED
发表于 2010-1-16 21:23:51 | 显示全部楼层
问题是出在了_WinAPI_GetDriveBusType函数,对于你的移动动盘,它总是不给你返回USB。所以就输出了FIXED。
 楼主| 发表于 2010-1-16 21:29:15 | 显示全部楼层
但我这里好像有USB的
C: => ATA
D: => ATA
E: => ATA
F: => ATA
H: => USB
发表于 2010-1-16 21:33:21 | 显示全部楼层
本帖最后由 pusofalse 于 2010-1-16 21:34 编辑

- -|||| sorry,是我错了。_WinAPI_GetDriveBusType返回的是一个数字常量,而非直接返回字符串格式的明文数据。已经修改,你看下。
 楼主| 发表于 2010-1-16 21:49:06 | 显示全部楼层
多谢版主帮忙,但我想要的是FIXED时只返回

C:
D:
E:
F:

REMOVABLE_DISK时只返回

h:
发表于 2010-1-16 22:10:58 | 显示全部楼层
回复 9# xdcysten


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

评分

参与人数 1金钱 +15 收起 理由
xdcysten + 15 还是很感谢版主帮忙

查看全部评分

发表于 2010-1-16 22:27:31 | 显示全部楼层
本帖最后由 afan 于 2010-1-17 12:56 编辑
回复  xdcysten


    这个我不会,需要你自己来了~
pusofalse 发表于 2010-1-16 22:10



    超版又出题了,哈~  
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[1] = [0], $i
        Local $aDrive = DriveGetDrive($type)
        For $i = 1 To $aDrive[0]
                If $flag = 0 And _WinAPI_GetDriveBusType($aDrive[$i]) = 7 Then
                        _ArrayAdd($aDisk, StringUpper($aDrive[$i]))
                        $aDisk[0] += 1
                ElseIf $flag = 1 And _WinAPI_GetDriveBusType($aDrive[$i]) <> 7 Then
                        _ArrayAdd($aDisk, StringUpper($aDrive[$i]))
                        $aDisk[0] += 1
                EndIf
        Next
        Return $aDisk
EndFunc   ;==>_DriveGetDrive

评分

参与人数 1金钱 +20 收起 理由
xdcysten + 20 谢谢帮忙

查看全部评分

 楼主| 发表于 2010-1-17 03:31:36 | 显示全部楼层
A版又完成了一道难题,哎俺这些菜鸟还在。。。。。。。。。,感谢A版帮忙。
发表于 2010-1-29 18:23:24 | 显示全部楼层
收藏 啦  
发表于 2011-4-1 16:49:16 | 显示全部楼层
学习了~
发表于 2012-7-22 19:44:13 | 显示全部楼层
学习了,还以为是我的移动硬盘有问题,都是fixed
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 11:15 , Processed in 0.085472 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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