Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вывести все файлы и папки (http://forum.oszone.net/showthread.php?t=135100)

morgan1991 18-03-2009 16:06 1067358

Вывести все файлы и папки
 
Вот нашол в справке такое:

Код:

#Include <File.au3>
#Include <Array.au3>
$FileList=_FileListToArray(@DesktopDir)
If @Error=1 Then
        MsgBox (0,"","No Files\Folders Found.")
        Exit
EndIf
_ArrayDisplay($FileList,"$FileList")

Но здесь он считывает всё только на рабочем столе. А как не зная структуру папок и файлов вывести всё в окошке:
Код:

GUICtrlCreateTreeView ( left, top [,width [,height [,style [,exStyle]]] )

Creat0R 18-03-2009 16:37 1067381

Цитата:

Цитата morgan1991
как не зная структуру папок и файлов вывести всё в окошке »

Код:

#include <Array.au3>

$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 1)
_ArrayDisplay($aFilesList)

Func _FileListToArrayEx($sPath, $sMask="*", $iMode=-1) ;$iMode > 0 только папки (маска игнорируется), иначе папки + файлы
    If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)

    Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0
    Local $sRegExpFilter = StringReplace(StringReplace($sMask, ".", "\."), "*", ".*")
    Local $iMax_Ret_Paths = 10000
    Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath]

    While $i < $aPathesArr[0]
        $i += 1

        $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*")
        If $hSearch = -1 Then ContinueLoop

        While
1
            $sFindNext = FileFindNextFile($hSearch)
            If @error Then ExitLoop

            $sFilePath = $aPathesArr[$i] & "\" & $sFindNext
            $iPathIsFolder
= StringInStr(FileGetAttrib($sFilePath & "\"), "D")

            If $iMode <= 0 Or ($iMode > 0 And $iPathIsFolder) Then
                If
$iPathIsFolder Or (Not $iPathIsFolder And StringRegExp($sFindNext, "(?i)" & $sRegExpFilter)) Then
                    If
$aPathesArr[0] >= $iMax_Ret_Paths Then
                        $iMax_Ret_Paths *= 2
                        ReDim $aPathesArr[$iMax_Ret_Paths+1]
                    EndIf

                    $aPathesArr[0] += 1
                    $aPathesArr[$aPathesArr[0]] = $sFilePath
                EndIf
            EndIf
        WEnd

        FileClose($hSearch)
    Wend

    ReDim $aPathesArr[$aPathesArr[0]+1]
    Return $aPathesArr
EndFunc


morgan1991 18-03-2009 17:17 1067404

Creat0R, спасибо, оно выводит только папки с рабочего стола, а надо всё полностью
Цитата:

Цитата Creat0R
$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 1) »

тут я сделал бы так:
Код:

$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 0)

proxy 18-03-2009 18:15 1067471

Код:

#include <Array.au3>

$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 1)
_ArrayDisplay($aFilesList)

Func _FileListToArrayEx($sPath, $sMask="*", $iMode=-1) ;$iMode > 0 только папки (маска игнорируется), иначе папки + файлы
    If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)

    Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0
    Local $sRegExpFilter = StringReplace(StringReplace($sMask, ".", "\."), "*", ".*")
    Local $iMax_Ret_Paths = 10000
    Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath]

    While $i < $aPathesArr[0]
        $i += 1

        $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*")
        If $hSearch = -1 Then ContinueLoop

        While
1
            $sFindNext = FileFindNextFile($hSearch)
            If @error Then ExitLoop

            $sFilePath = $aPathesArr[$i] & "\" & $sFindNext
            $iPathIsFolder
= StringInStr(FileGetAttrib($sFilePath & "\"), "D")

            If $iMode <= 0 Or $iMode > 0 Then
                If
$iPathIsFolder Or (Not $iPathIsFolder And StringRegExp($sFindNext, "(?i)" & $sRegExpFilter)) Then
                    If
$aPathesArr[0] >= $iMax_Ret_Paths Then
                        $iMax_Ret_Paths *= 2
                        ReDim $aPathesArr[$iMax_Ret_Paths+1]
                    EndIf

                    $aPathesArr[0] += 1
                    $aPathesArr[$aPathesArr[0]] = $sFilePath
                EndIf
            EndIf
        WEnd

        FileClose($hSearch)
    Wend

    ReDim $aPathesArr[$aPathesArr[0]+1]
    Return $aPathesArr
EndFunc

вот это:
Цитата:

If $iMode <= 0 Or ($iMode > 0 And $iPathIsFolder) Then
заменяешь на это:
Цитата:

If $iMode <= 0 Or $iMode > 0 Then

morgan1991 18-03-2009 19:03 1067532

Дак всёравно выводит только с рабочего стола, а надо со всех жестаков и носителей.

proxy 18-03-2009 19:13 1067540

Цитата:

Цитата morgan1991
а надо со всех жестаков и носителей. »

прочитать то можно, а вот вывести вс это в _ArrayDisplay думаю не получится,
так как скорее всего напоримся на ограничения по выводу строк
в ListView элементе.

а делается так, вот тут
Цитата:

$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 1)
@DesktopDir надо заменить на адрес диска, к примеру так:
Цитата:

$aFilesList = _FileListToArrayEx("c:\", "*", 1)
Все диски можно получить:
Код:

$var = DriveGetDrive( "all" )
If NOT @error Then
    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
        MsgBox(4096,"Drive " & $i, $var[$i])
    Next
EndIf


а далее перебором вызывать поиск файлов и папок..

файлов та многа на жестких - обробатываться бууууууууддддееееиттт )))))))))))))

Код:

$var = DriveGetDrive( "all" )
If NOT @error Then
;~    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
;~        MsgBox(4096,"Drive " & $i, $var[$i])
        $aFilesList = _FileListToArrayEx($var[$i] & "\", "*", 1)
        _ArrayDisplay($aFilesList)
    Next
EndIf


Creat0R 18-03-2009 22:35 1067728

Цитата:

Цитата proxy
заменяешь на это »

Не советую это делать (проверка на папки нужна, чтобы вернуть правильную структуру каталогов). Тем более что можно просто «If $iMode <> 0 Then», зачем два раза проверять :).

Цитата:

Цитата proxy
напоримся на ограничения по выводу строк »

Неа, в _ArrayDisplay это предусмотренно (в 3.2.8.1+ по крайней мере).


Время: 14:32.

Время: 14:32.
© OSzone.net 2001-