Компьютерный форум 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=147851)

Lodoss 13-08-2009 09:14 1192494

Посчитать количество файлов в папке
 
Доброго времени суток ! Подскажите пожалуйста как можно посчитать количество файлов в папке ?

amel27 13-08-2009 09:26 1192499

Lodoss, если без подкаталогов, то просто:
Код:

#Include <File.au3>

$sFPath = @WindowsDir
$aFiles = _FileListToArray($sFPath, '*', 1)
$iFiles = $aFiles[0]

MsgBox(64, "Результат", 'В папке "'& $sFPath & '" найдено '& $iFiles &' файлов.')


Lodoss 13-08-2009 09:27 1192501

Благодарю ! А если с подкаталогами ? Думаю тоже пригодится.

Lodoss 13-08-2009 10:06 1192530

Если папка пуста, вылетает ошибка :( Можно как нибудь её обойти ?

amel27 13-08-2009 10:13 1192543

Цитата:

Цитата Lodoss
Если папка пуста, вылетает ошибка »

Код:

#Include <File.au3>

$sFPath = @WindowsDir
$aFiles = _FileListToArray($sFPath, '*', 1)
$iFiles = 0

If IsArray($aFiles) Then $iFiles = $aFiles[0]
MsgBox(64, "Результат", 'В папке "'& $sFPath & '" найдено '& $iFiles &' файлов.')

Цитата:

Цитата Lodoss
А если с подкаталогами ? Думаю тоже пригодится. »

тут много вариантов можно напридумать: :)
Код:

#Include <File.au3>

$sFPath = @WindowsDir
$iFiles = _FilesInFolder($sFPath)

MsgBox(64, "Результат", 'В папке "'& $sFPath & '" найдено '& $iFiles &' файлов.')

Func _FilesInFolder($sRoot)
    Local $aFolders = _FileListToArray($sRoot,'*', 2)
    Local $aFiles = _FileListToArray($sRoot,'*', 1), $iCount=0
    If IsArray($aFolders) Then
        For
$i=1 To $aFolders[0]
            $iCount+= _FilesInFolder($sRoot &"\"& $aFolders[$i])
        Next
    EndIf
    If
IsArray($aFiles) Then $iCount += $aFiles[0]
    Return $iCount
EndFunc


Lodoss 13-08-2009 10:23 1192554

Большущее спасибо !!! А то массивы ну никак не могу победить :(

amel27 13-08-2009 11:22 1192606

Цитата:

Цитата Lodoss
А то массивы ну никак не могу победить »

ИМХО это недоработка _FileListToArray(), т.к. пустая папка - нормальная ситуация, а не ошибочная, т.е. UDF в этом случае должна возвращать пустой массив... иначе, зачем было вообще заморачиваться массивом со счетчиком? :idontnow:

Diamond 16-08-2009 00:50 1194512

Lodoss, Можно ещё так:
Код:

$aInfo = DirGetSize(@WindowsDir, 1)
MsgBox(0,@WindowsDir,"Общий размер: " & Round($aInfo[0]/1024^2) & " MB" & @LF & _
"Кол-во файлов: " & $aInfo[1] & @LF & _
"Кол-во папок: " & $aInfo[2])


Yoxcel 20-08-2009 21:32 1198738

Не стал создавать новую тему, так как вопрос, кажется, похожий, но чуть посложней.
Пытался написать скрипт, создающий древовидный список папок и файлов, но мозги закипают и ничего не выходит, кроме "вылетания" скрипта с ошибкой или неверного результата. Понятно, что надо использовать рекурсию, но пока до конца не разобрался.
Может, у кого есть готовое решение? :-)

Iska 20-08-2009 22:43 1198802

Yoxcel, можно, конечно, и «FileFindFirstFile/FileFindNextFile», однако в этом случае, на мой взгляд, самое простое — пользовать не средства AutoIt, а библиотеку «Scripting.FileSystemObject»:
Код:

$objFSO = ObjCreate("Scripting.FileSystemObject")
и делать сие по полной аналогии с известными скриптами vbscript:
Код:

Local Const $DriveTypeFixed = 2

Local $objFSO
Local $objDrive


$objFSO = ObjCreate("Scripting.FileSystemObject")

For $objDrive In $objFSO.Drives()
        If $objDrive.DriveType = $DriveTypeFixed Then
                ScanFolders($objDrive.RootFolder)
        EndIf
Next

$objFSO = ""

Exit(0)
;=============================================================================

;=============================================================================
Func ScanFolders($objFolder)
        Local $objSubFolder
        Local $objFile

        ; Перебирать можно как в нисходящей…
        ConsoleWrite("[" & $objFolder.Path & "]" & @CRLF)

        For $objFile In $objFolder.Files
                ConsoleWrite($objFile.Name & @CRLF)
        Next

        For $objSubFolder In $objFolder.SubFolders
                ScanFolders($objSubFolder)
        Next

        ; …так и в восходящей последовательности.
        ;ConsoleWrite("[" & $objFolder.Path & "]" & @CRLF)
        ;
        ;For $objFile In $objFolder.Files
        ;        ConsoleWrite($objFile.Name & @CRLF)
        ;Next
EndFunc
;=============================================================================

добирая недостающий функционал уже средствами самого AutoIt.

читать дальше »
Я часто удивляюcь, почему столь нередко забывают и обходят стороной одно из самых выдающихся достижений AutoIt — использование Automation.

amel27 21-08-2009 04:12 1199020

Цитата:

Цитата Iska
делать сие по полной аналогии с известными скриптами vbscript »

может я ошибаюсь, но мне почему-то кажется, что проблема не в получении списка, а в постороении дерева... т.е. нужно определиться в способе хранения/обработки полученного списка, варианты:

- в простом массиве;
- с учетом сохранения отношений родители/дети (связные списки);
- прямо в контролах (TreeView/Menu)

конкретная реализация зависит от задачи, вариант для меню выкладывал ранее Creat0R: http://forum.oszone.net/showthread.p...enu#post667339 :)


Время: 06:14.

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