Войти

Показать полную графическую версию : [решено] Вывести все файлы и папки


morgan1991
18-03-2009, 16:06
Вот нашол в справке такое:

#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
как не зная структуру папок и файлов вывести всё в окошке »

#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
Creat0R, спасибо, оно выводит только папки с рабочего стола, а надо всё полностью$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 1) »
тут я сделал бы так:
$aFilesList = _FileListToArrayEx(@DesktopDir, "*", 0)

proxy
18-03-2009, 18:15
#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
Дак всёравно выводит только с рабочего стола, а надо со всех жестаков и носителей.

proxy
18-03-2009, 19:13
а надо со всех жестаков и носителей. »
прочитать то можно, а вот вывести вс это в _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
заменяешь на это »
Не советую это делать (проверка на папки нужна, чтобы вернуть правильную структуру каталогов). Тем более что можно просто «If $iMode <> 0 Then», зачем два раза проверять :).

напоримся на ограничения по выводу строк »
Неа, в _ArrayDisplay это предусмотренно (в 3.2.8.1+ по крайней мере).




© OSzone.net 2001-2012