天堂泪吻泪 发表于 2010-2-5 00:30:24

两层FOR嵌套,再加IF不起作用???

本帖最后由 天堂泪吻泪 于 2010-2-5 01:33 编辑

像刚刚http://www.autoitx.com/thread-12836-1-1.html这个贴子一样,通过FileExists来判断这个盘符是否存在,但对软驱和光驱的支持还不够好,所以想做一个两层FOR循环来判断,可循环做到了,但没了判断!!!!!再求大家帮助在下解答下!!!:face (35):

刚刚才那贴可以说是完美的解决了问题,而且达到了在下想要的效果,详见http://www.autoitx.com/thread-12836-1-1.html四楼!

但是在下还是想知道为什么这个二层循环中的IF会不起任何作用???

一二楼已经完美解决了这些问题了!

在下知道方法的确很多,但在下只是想用自己当前所知道的知识来解决这个问题,有什么不当之处,还请两位大大见谅!!!#include <array.au3>

$letter=_GetDriverEmptyLetter()
_ArrayDisplay($letter)
Func _GetDriverEmptyLetter()
      Local $AllLetter,$Disk=DriveGetDrive("ALL")
      Local $i, $j,$n = 1
      $AllLetter = 0
      For $i = 1 To 26
                        For $j=1 To $Disk
                If Not ($Disk[$j]=Chr(96 + $i) & ":" )Then
                        $n += 1
                        ReDim $AllLetter[$n]
                        $AllLetter[$n - 1] = Chr(96 + $i) & ":"
                                EndIf
                        Next
      Next
      $AllLetter = $n-1
                Return $AllLetter
      ;_ArrayDisplay($AllLetter)
EndFunc   ;==>_GetDriverEmptyLetter

pusofalse 发表于 2010-2-5 00:57:41

本帖最后由 pusofalse 于 2010-2-5 01:09 编辑

方法多如牛毛。 - -|||#include <Array.au3>

$aEmpty = _GetEmptyDrives1()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives2()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives3()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives4()
_Arraydisplay($aEmpty)

$aEmpty = _GetEmptyDrives5()
_Arraydisplay($aEmpty)

#include <WinAPI.au3>
$aEmpty = _GetEmptyDrives6()
_Arraydisplay($aEmpty)

Func _GetEmptyDrives1()
        Local $sDrives, $aDrive, $sResult

        $aDrive = DriveGetDrive("All")
        For $i = 1 To $aDrive
                $sDrives &= $aDrive[$i]
        Next
        For $i = 1 to 26
                $sResult &= Chr(96 + $i)
        Next
        $sResult = StringRegExpReplace($sResult, "[" & $sDrives & "]", "")
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives1

Func _GetEmptyDrives2()
        Local $aDrive, $sDrive, $sResult
        $aDrive = DriveGetDrive("All")
        For $i = 1 To $aDrive
                $sDrive &= $aDrive[$i]
        Next
        For $i = 1 To 26
                If Not StringInStr($sDrive, Chr(96 + $i)) Then
                        $sResult &= Chr(96 + $i)
                EndIf
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives2

Func _GetEmptyDrives3()
        Local $aDrive, $sDrive, $sResult
        $aDrive = DriveGetDrive("All")
        For $ii = 1 To $aDrive
                Assign($aDrive[$ii], 0)
        Next
        For $ii = 1 To 26
                If Not IsDeclared(Chr(96 + $ii) & ":") Then
                        $sResult &= Chr(96 + $ii)
                EndIf
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives3

Func _GetEmptyDrives4() ; ?? Can you find BUGs on this function?
        Local $sResult, $sDrive

        $aDrive = DriveGetDrive("All")
        For $i = 1 To 26
                $sDrive &= Chr($i + 96)
        Next
        $sResult = "ab" & StringTrimLeft($sDrive, 2 + $aDrive)
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives4

Func _GetEmptyDrives5()
        Local $aDrive, $aEnum, $sResult, $iFlags

        $aDrive = DriveGetDrive("All")
        For $i = 1 To 26
                $aEnum &= Chr(96 + $i)
        Next
        $aEnum = StringSplit($aEnum, "")
        For $j = 1 To $aEnum
                $iFlags = 0
                For $i = 1 To $aDrive
                        If ($aEnum[$j] & ":" = $aDrive[$i]) Then
                                $iFlags = 1
                                ExitLoop
                        EndIf
                Next
                If $iFlags = 0 Then $sResult &= $aEnum[$j]
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives5

Func _GetEmptyDrives6()
        Local $sResult, $hFile

        For $i = 1 To 26
                $hFile = _WinAPI_CreateFile("\\.\" & Chr(96 + $i) & ":", 0, 0, 0, 0, 0)
                If _WinAPI_GetLastError() = 2 Then $sResult &= Chr(96 + $i)
                If ($hFile > 0) Then _WinAPI_CloseHandle($hFile)
        Next
        Return StringSplit($sResult, "")
EndFunc        ;==>_GetEmptyDrives6

afan 发表于 2010-2-5 01:13:34

本帖最后由 afan 于 2010-2-5 01:21 编辑

回复 1# 天堂泪吻泪


    方法的确很多…… 这里修改LZ要求的两层For的问题#include <array.au3>

$letter = _GetDriverEmptyLetter()
_ArrayDisplay($letter)

Func _GetDriverEmptyLetter()
        Local $AllLetter = , $Disk = DriveGetDrive("ALL")
        Local $i, $j, $n = 1, $tmp, $ck = 0
        For $i = 3 To 26 ;直接略去a、b盘
                $tmp = Chr(96 + $i) & ":"
                For $j = 1 To $Disk
                        If $tmp = $Disk[$j] Then
                                $ck = 1
                                ExitLoop
                        Else
                                $ck = 0
                        EndIf
                Next
                If $ck = 0 Then
                        $n += 1
                        ReDim $AllLetter[$n] ;LS的老大给出的最后才输出就是效率,建议修改
                        $AllLetter[$n - 1] = $tmp
                EndIf
        Next
        $AllLetter = $n - 1
        Return $AllLetter
EndFunc   ;==>_GetDriverEmptyLetter

pusofalse 发表于 2010-2-5 01:28:56

回复 3# afan


   Quote:
   ;LS的老大给出的最后才输出就是效率,建议修改
——这句愣是没看懂。- -||||

afan 发表于 2010-2-5 01:32:42

回复afan


   Quote:
   ;LS的老大给出的最后才输出就是效率,建议修改
——这句愣是没看懂。- -| ...
pusofalse 发表于 2010-2-5 01:28 http://www.autoitx.com/images/common/back.gif

就是说您呐,先不去声明数组、ReDim之类的,用 &= 连接为字符串,最后用 StringSplit 输出 = 高效率,您老大一贯的原则“高效率”

pusofalse 发表于 2010-2-5 01:40:16

回复 5# afan



    - -|||,原谅我愚钝,现在我看懂了表面意思,afan兄内在的涵义还没弄清。
1、您?老大?为何用这样的称呼呢?
2、高效率? or “高效率”?
3、建议修改?既然是高效,为何要修改呢?

afan 发表于 2010-2-5 01:46:09

1,算啦,还是用 pusofalse 超版吧……
2,“”在这起强调的作用……
3,是建议LZ修改成你的代码,以提高效率

菜鸟我没法用编程的语言解释,只能如此了.... - - ||

pusofalse 发表于 2010-2-5 01:50:59

回复 7# afan


    - -|||
原谅我愚钝至极。
抱歉至极。:face (37):

afan 发表于 2010-2-5 02:05:08

回复 8# pusofalse


    哪里哪里,是超版你太过谦了.:face (32):

另外,LZ想按自己的思路完成那也是很要支持的,有创造力总比固有的思维要好。在固有好的基础上再创造可能会更好。呵呵
页: [1]
查看完整版本: 两层FOR嵌套,再加IF不起作用???