Привет всем!
Для чего нужен Background worker, и как с ним работать?
Если можно небольшой примерчик?
И еще вопросик:
Например идет перебор и добавление файлов в листбокс
для обработки ошибок используется try cath
доходит до определенного файла к которому нет доступа выдает сообщение что доступ к файлу или папке запрещен и все перебор останавливается.
Вопрос как правильно обработать такую ситуацию, выдать соответствующее сообщение и перейти к следующему файлу не прерывая работы?
1.
Background Worker - это обертка потока. Поток - это подпрограмма, которая работает параллельно с основным кодом, и работает она абсолютно ассинхронно. Возможно и на другом ядре, если у тебя многоядерный проц. Суть проста: в событии воркера DoWork пишешь код, потом вызывваешь у воркера метод RunWorkerAsync и код, написанный в DoWork запускается. Разница между обычной процедурой и запуском потока состоит в том, что после вызова подпрограммы твой код идет дальше, и не дожидается окончания выполения того, что написано в DoWork у воркера. Оно работает само посебе независимо от проги. Ты можешь обращаться к общим переменным из другого потока, но работу с интерфейсом можешь осуществлять только из главного потока, в котором у тебя висит окно.
Я думаю, с этим тебе пока связываться не стоит, ибо многопоточность - штука серьезная, требующая глубокого понимания.
2. Тупо и просто: обработчик ошибок суешь в отдельную процедуру, и вызываешь ее для всех файлов. Если происходит ошибка, код прерывается только на уровне процедуры, а цикл переходит к следующему файлу.
Dim dirinfo AsNew System.IO.DirectoryInfo(dirName)
Try
Dim dirs() As System.IO.FileSystemInfo = dirinfo.GetDirectories("*", IO.SearchOption.TopDirectoryOnly)
Me.Text = dirs.Length
For j AsInteger = 0 To dirs.Length - 1
subdir = dirs(j).FullName
MsgBox(subdir)' тут мы последовательно увидим все папки верхнего уровня (в т.ч. СистемВолюм... и Рециклер)
Dim fileinfo AsNew System.IO.DirectoryInfo(subdir)
Try
Dim files() As System.IO.FileSystemInfo = fileinfo.GetFiles("*.*", System.IO.SearchOption.AllDirectories)
For i AsInteger = 0 To files.Length - 1
With lvInTo.Items.Add(files(i).Name, 0)
.SubItems.Add(files(i).Extension)
.SubItems.Add(FileLen(files(i).FullName))
.SubItems.Add(files(i).CreationTime)
.SubItems.Add(files(i).FullName)
EndWith
Next i
Catch ex As Exception
MsgBox(ex.Message)
EndTry
Next
Catch ex As Exception
EndTry
'а тут мы ловим файлы, лежащие непосредственно в папке dirName
Dim fileinfo1 AsNew System.IO.DirectoryInfo(dirName)
Try
Dim files() As System.IO.FileSystemInfo = fileinfo1.GetFiles("*.*", System.IO.SearchOption.TopDirectoryOnly)
For i AsInteger = 0 To files.Length - 1
With lvInTo.Items.Add(files(i).Name, 0)
.SubItems.Add(files(i).Extension)
.SubItems.Add(FileLen(files(i).FullName))
.SubItems.Add(files(i).CreationTime)
.SubItems.Add(files(i).FullName)
EndWith
Next i
Catch ex As Exception
EndTry
EndIf
Me.Text = Me.Text & "/" & Me.lvInTo.Items.Count
EndSub
Таким образом, сначала создаем список папок, непосредственно входящих в данную, а затем их по очереди просматриваем и заносим в ЛистВью.
Недостаток: может считать весьма долго. Ну и до оптимизации кода далеко. Однако же все что надо, она мне предоставила.
Примечание: Me.Text... - встречается 2 раза . Это тестовое: показывает кол-во папок верхнего уровня/кол-во файлов в ЛистВью. Сошлось с системой, если убрать в настройке вида папки (в Винде) скрытие системных файлов (винда на это злодеяние ругается )
Автор ответов 1,4,5,6,8 один и тот же - я
Просто немножко нахалтурил с учетками на форуме: на одном компе заходил под одной, а на другом - под другой. Исправлюсь.
И по поводу списка файлов: зачем это вообще надо? какой смысл в получении списка (не структурированного) ВСЕХ файлов на диске?! Я при тестировании указал искать в системном диске - растянулось минут на 5 удовольствие (там всего около 55000 файлов). Ну и список получил соответствующий - практически бесполезный для юзера...
Дмитрий (автор вопроса), зачем ЭТО ?
Сикоки-сикоки?! На одном только логическом диске с системой и установленными прогами?! Доктор явно врет!
А все ж вопрос остался: зачем пользователю список файлов со всего диска?!
Мдя...
Вот и заостряется вопрос о целесообразности получения этого списка.
Может, автор вопроса расскажет подробнее, зачем ему надо это? Авось чего интереснее и производительнее придумаем...
Вот только где же он?
Дмитрий №1 пишет:
А все ж вопрос остался: зачем пользователю список файлов со всего диска?!
Следовательно автор не этот Дмитрий, т.к. он бы знал зачем ему весь список!
Дмитрий №2 пишет:
Может, автор вопроса расскажет подробнее, зачем ему надо это? Авось чего интереснее и производительнее придумаем...
Вот только где же он?
Этот Дмитрий тоже не автор...
Лично я уже сбился кто есть кто Оо!