Добро пожаловать к нам в гости! Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Натыкался на проги, где например идет сканирование дириктории и паралельно показывается прогресс процесса как это реализованно?! пытался повторить, но нифига не получается, сдается мне тут нужен мега математический подход. Если по простому с известным конечным результатом, например мы сканируем некую папку с файлами ширина прогресс бара 200рх. 1)progres_bar=200 2)i - счетчик процесса в папке 150 файлов 3)files=150 формула будет:
Quote
200/150*i progres_bar/files*i
А если "files" не известно, т.е. эта переменная по мере процесса увеличивается, но конечный результат неизвестен (может быть и 130 и 240 и т.д.) + будут вложенные папки тоже содержащие файлы и для них отдельно будет запускатся сканирование
ну тут 2 подхода: - надо сперва определить кол-во (или обьем) всех файлов перед операцией - вести счетчик по этапам операции их в принципе можно скомбинировать. а в каких это случаях что-то там неизвестно? перед стартом все можно определить и посчитать Как задавать вопросы
это когда вложенные папки, а вних есно файлы Я делаю так:
Code
FileList "[dir]\*.*" "Files+Folders" "[tmp]" .помещаю результат в ListBox, потом получаю общее кол-во ListBoxSize "temp" "[size_temp]" .перебираю результат файлы на лево, папки на право Loop "1" "[size_temp]" "[i]" FileExists "[dir]\[checkF]" "[ok]" If "[ok]" "=" "True" ..................... Else ..................... EndIf Math "200/[size_temp]*[i]" "" "[procent]" SizeObject "progres_bar" "[procent]" "19" EndLoop .с этим проблем нет, все известно все хорошо .начинаю сканировать найденые папки, на наличие файлов .запускается цикл...
Цикл запускается этот же по новой, но уже с другой папкой а заодно запускается по новой и прогресс бар, а я хочу прогресс общий
Добавлено (17 Декабрь 2009, 11:10) --------------------------------------------- решение кроется в математике, но как расчитать мозга не хватает
Цикл запускается этот же по новой, но уже с другой папкой а заодно запускается по новой и прогресс бар, а я хочу прогресс общий
Выходит что нужно вначале произвести общий подсчет всех файлов в данной папке и во вложенных подпапках! А потом запускать прогрессБар и параллельно выполнять требуемые действия с этими файлами.
Для подсчета файлов я бы тебе рекомендовал использовать мою функцию, тогда не придется использовать ЛистБокс. Я ее отлично заточил для сканирования папок, только тебе нужно будет поменять копирование файлов на их подсчет...
А вообще в таком случае, когда не известно время выполнения задачи, я бы использовал циклический прогрессБар, лучше круговой:
у меня сейчас такой, неприкалывает
Quote (DEMBEL)
да, кстати, обычно так и делают
это где?! если только на сайтах, в прогах делают иначе У меня есть прога-чистилка, которая ищет ненужные файлы, вот там сканируется диск и попутно идет прогресс
ну тогда мозгой пошевели. общее количество мест где ищутся папки тебе же известно? если только не на всем компе все подряд смотреть, обычно чистятся папки в определенных местах, их набор ограничен. так вот посчитай, в каких локациях ищутся и чистятся папки и в скрипте очистки папок раздели кол-во папок и файлов на количество локаций. Да и если даже искать по всему диску, то раздели количество найденных папок и файлов на кол-во папок корневого каталога. Так у тебя получится, что в каждый момент времени будет считаться процент только определенной группы файлов+папок, которые просматриваются в этот момент, а в конце складываться в общее кол-во. Идея понятна?
Добавлено (17 Декабрь 2009, 13:54) --------------------------------------------- А для получения инфы о количестве папок/файлов лучше не перебирать их а воспользоваться скриптом, который просто прочитает эту инфу с файловой системы на винчестере, а то долго перебирать придется.
DEMBEL, сканируется 2-3 папки, но вних неизвестное количество папок и файлов, как в TEMP, неизвестно, кто и сколько туда распакует, ну жа ладно, я всеравно не догнал твою идею
сканируется 2-3 папки, но вних неизвестное количество папок и файлов, как в TEMP,
ну вот, идешь в одну папку, считаешь кол-во элементов в ней, а верхний порог для процентов делаешь не 100 а 100/кол-во папок, т.е. 50 или 33. по проверке всех 2(3) папок получишь общий процент. весь вопрос в том как узнать количество элементов в отдельных папках, так?
вот по этому принципу. сколько папок - столько этапов.
Quote (DEMBEL)
их в принципе можно скомбинировать.
во время каждого этапа считаешь его процент, потом прибавляешь к нему процент следующих этапов. max процент этапа = 100/кол-во этапов. Как задавать вопросы
эти варианты я уже проделывал, в одном случае работает, в другом(помоемому когда папка в папке и они пустые)работает не корректно, может с помощью вбс?! я то хочу чтоб у меня все попутно решалось, а не сначало сканировать, а потом показывать прогресс
это еще почему не так? приведи конкретные условия в каких папках что искать
Quote (sp3d)
вопрос, про скрипт
какую конкретно информацию надо узнать в скрипте? количество файлов и подпапок отдельно в папке или общее количество файлов, или еще чтото? Как задавать вопросы
вроде да. можно узнавать все размеры а также количество вложенных элементов (папки, файлы) в любой папке. тебе что надо узнать? можно кстати вести прогресс не по кол-ву элементов, а по размеру (допустим, в случае копирования или удаления, ну или еще чего-то где меняется размер) Как задавать вопросы
dim oFS, oFolder set oFS = WScript.CreateObject("Scripting.FileSystemObject") Set WshShell = WScript.CreateObject("WScript.Shell") sPath = WshShell.ExpandEnvironmentStrings("%Temp%") Set oFolder = oFS.GetFolder(sPath)
ShowFolderDetails oFolder
sub ShowFolderDetails(oF) dim F wscript.echo oF.Name & ":Размер=" & oF.Size wscript.echo oF.Name & ":#файлов=" & oF.Files.Count wscript.echo oF.Name & ":#папок=" & oF.Subfolders.count for each F in oF.Subfolders ShowFolderDetails(F) next end sub
это как видишь для Temp, для конкретной папки напиши ее путь в oFS.GetFolder вместо sPath
а если тебе не нужны параметры вложенных папок то процедуру
Code
ShowFolderDetails oFolder
sub ShowFolderDetails(oF) dim F wscript.echo oF.Name & ":Размер=" & oF.Size wscript.echo oF.Name & ":#файлов=" & oF.Files.Count wscript.echo oF.Name & ":#папок=" & oF.Subfolders.count for each F in oF.Subfolders ShowFolderDetails(F) next end sub
можешь выкинуть. она просто при нахождении подпапки в папке запускает процедуру снова в цикле, при нахождении еще подпапок - снова запускает, пока не выдаст параметры отдельно для каждой вложенной папки. Если интересует только общие параметры для одной папки то просто присвой значения в переменные как я написал выше.
Добавлено (17 Декабрь 2009, 15:11) --------------------------------------------- вот срань. ну ка я попробую по другому.
Добавлено (17 Декабрь 2009, 15:23) --------------------------------------------- Ну недоглядел, копи пасте было... убери слово WScript тут set oFS = WScript.CreateObject("Scripting.FileSystemObject")
Code
dim oFS, oFolder set oFS = CreateObject("Scripting.FileSystemObject")
а если надо инфу для всех вложенных папок, то можно оставить цикл и прописать там команды складывания параметров в необушный массив или Листбокс, потом доставать их в проекте.
on error resume next - переходить на другую строчку при ошибке, обработка ошибки через обьект Err - Err.Number (номер ошибки), Err.Description (описание ошибки), Err.Clear (очистить переменную). Например:
Code
On Error Resume Next Err.Clear ... операции где отловить ошибки ... If Err.Number <> 0 then MsgBox "Ошибка:" & vbCrLf &_ " Номер: " & Err.Number & vbCrLf &_ " Описание: '" & Err.Description & vbCrLf End If
on error resume 0 - выключить обработку ошибок (в смысле, отключить их игнорирование и отловку, окна с ошибками снова будут вылезать) Как задавать вопросы