-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Посчитать количество файлов в папке
Доброго времени суток ! Подскажите пожалуйста как можно посчитать количество файлов в папке ?
|
Lodoss, если без подкаталогов, то просто:
Код:
#Include <File.au3>
$sFPath = @WindowsDir
$aFiles = _FileListToArray($sFPath, '*', 1)
$iFiles = $aFiles[0]
MsgBox(64, "Результат", 'В папке "'& $sFPath & '" найдено '& $iFiles &' файлов.')
|
Благодарю ! А если с подкаталогами ? Думаю тоже пригодится.
|
Если папка пуста, вылетает ошибка :( Можно как нибудь её обойти ?
|
Цитата:
Цитата 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
А то массивы ну никак не могу победить »
|
ИМХО это недоработка _FileListToArray(), т.к. пустая папка - нормальная ситуация, а не ошибочная, т.е. UDF в этом случае должна возвращать пустой массив... иначе, зачем было вообще заморачиваться массивом со счетчиком? :idontnow:
|
Lodoss, Можно ещё так:
Код:
$aInfo = DirGetSize(@WindowsDir, 1)
MsgBox(0,@WindowsDir,"Общий размер: " & Round($aInfo[0]/1024^2) & " MB" & @LF & _
"Кол-во файлов: " & $aInfo[1] & @LF & _
"Кол-во папок: " & $aInfo[2])
|
Не стал создавать новую тему, так как вопрос, кажется, похожий, но чуть посложней.
Пытался написать скрипт, создающий древовидный список папок и файлов, но мозги закипают и ничего не выходит, кроме "вылетания" скрипта с ошибкой или неверного результата. Понятно, что надо использовать рекурсию, но пока до конца не разобрался.
Может, у кого есть готовое решение? :-)
|
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.
|
Цитата:
Цитата Iska
делать сие по полной аналогии с известными скриптами vbscript »
|
может я ошибаюсь, но мне почему-то кажется, что проблема не в получении списка, а в постороении дерева... т.е. нужно определиться в способе хранения/обработки полученного списка, варианты:
- в простом массиве;
- с учетом сохранения отношений родители/дети (связные списки);
- прямо в контролах (TreeView/Menu)
конкретная реализация зависит от задачи, вариант для меню выкладывал ранее Creat0R: http://forum.oszone.net/showthread.p...enu#post667339 :)
|
Время: 06:14.
© OSzone.net 2001-