Помогите!!!ОЧЕНЬ НАДО Как отслеживать изменения в папке????

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Netguard
Постоялец
Постоялец
 
Сообщения: 489
Зарегистрирован: 26.07.2002 (Пт) 13:31
Откуда: Russia

Помогите!!!ОЧЕНЬ НАДО Как отслеживать изменения в папке????

Сообщение Netguard » 24.09.2003 (Ср) 19:19

Здравствуйте! Помогите плиззз. Срочно нужен исходник. Задача следующая..... Мне нужно каждую сек. отслеживать появился ли в папке новый файл и какой или изменился ли размер файлов уже существующих. Но проблема заключается в том что все это надо отслеживать в 32ух разных папках.

Помогите плиззз очень срочно надо!!!. У меня был подобный исходник но он погиб вместе с винтом.

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Re: Помогите!!!ОЧЕНЬ НАДО Как отслеживать изменения в папке?

Сообщение Taras2 » 25.09.2003 (Чт) 8:47

Netguard писал(а):Мне нужно каждую сек. отслеживать появился ли в папке новый файл и какой или изменился ли размер файлов уже существующих.

Тут уже неоднократно поднимался этот вопрос, в частности и мной, сдесь. У меня кстати так и не заработало.
Удачи!

seelts
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 21.11.2002 (Чт) 11:24
Откуда: Russia

Сообщение seelts » 25.09.2003 (Чт) 13:23

а что если делать всё время ДИР(*.*) и сравнивать с предыдущим вызовами? сам не проверял, но думаю, что если это делать через каждую секунду, то тормозить будет неимоверно... (или нет? эксперты, где вы?)
если создать алгоритм, которым сможет пользоваться даже дурак, то только дурак и будет им пользоваться

Taras2
Обычный пользователь
Обычный пользователь
 
Сообщения: 82
Зарегистрирован: 20.06.2003 (Пт) 12:13

Сообщение Taras2 » 25.09.2003 (Чт) 15:18

seelts писал(а):а что если делать всё время ДИР(*.*) и сравнивать с предыдущим вызовами? сам не проверял, но думаю, что если это делать через каждую секунду, то тормозить будет неимоверно... (или нет? эксперты, где вы?)

По крайней мере кэш диска не даст тормозить.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 25.09.2003 (Чт) 15:29

Почитайте в МСДН что пишут про FindFirstChangeNotification и не изобретайте велосипед :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4158
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.09.2003 (Чт) 16:20

А если создать 32 невидимых ListBox-а, настроить их на соответствующие папки, ну и Refresh - и проверей.

Netguard
Постоялец
Постоялец
 
Сообщения: 489
Зарегистрирован: 26.07.2002 (Пт) 13:31
Откуда: Russia

Сообщение Netguard » 25.09.2003 (Чт) 16:28

Посмотрел я в MSDN но чето там кривовато написано. (у меня старинький MSDN) Если не сложно выложите кодик или дайте ссылку на рабочий код.

А насчет обновления ListBox это не реально . Мне надо чтобы информация о изменениях поступала быстро.

.........Рассказываю зачем мне это надо. Я сейчас занимаюсь интеграцией Системы видионаблюдения с П.О. управления световым обарудованием. Так вот система видеонаблюдения при движении в камере создает файлы с инфой. Когда движение кончается и наченается новое движение то создается новый файл. Так вот мне надо как только создался файл запускать нужные команды в П.О. управления световым обарудованием. А камер 32 штуки и соответственно 32 разные папки. У меня проблема заключается в том что надо быстро отлавливать создание файлов. Не более 1 сек с момента создания файла.


Вот такая проблемка. Помогите если можите.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 25.09.2003 (Чт) 16:35

Чего там криво-то? У меня МСДН самый первый - июль 2001 года.

Декларируешь АПИ:

Код: Выделить всё
Public Declare Function WaitForMultipleObjects Lib "kernel32" Alias "WaitForMultipleObjects" (ByVal nCount As Long, lpHandles As Long, ByVal bWaitAll As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Public Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
Public Const INFINITE = &HFFFF      '  Infinite timeout


Потом пишеь что то типа:
Код: Выделить всё
dwChangeHandle = FindFirstChangeNotification("C:\\WINDOWS",False, FILE_NOTIFY_CHANGE_FILE_NAME)

dwWaitStatus = WaitForMultipleObjects(1, dwChangeHandle, False, INFINITE)


И дальше анализировать полученный статус.

Netguard
Постоялец
Постоялец
 
Сообщения: 489
Зарегистрирован: 26.07.2002 (Пт) 13:31
Откуда: Russia

Сообщение Netguard » 26.09.2003 (Пт) 9:09

RayShade
Проверил твой код но почему-то он возвращает всегда 0.
И при слежке за папкой вешается программа, до того момента пока изменений в папке не будит, нельзя ничего в проге сделать.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 26.09.2003 (Пт) 9:58

Все правильно. Внимательно описание функции почитай, что и как она возвращает. А насчет того что все вешается - это архитектура ВБ такая :) Там всего 1 поток команд, а эта функция синхронная, так что приложение ждет ее выполнения и дальше не работает. Можно попробовать CreateThread и в новый поток затолкать вызов и обработку?

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 26.09.2003 (Пт) 13:48

Вообще-то это можно проделать через FSO. Просто загружжаем библиотечку Microsoft Script Running и ...
Объявляем массивы и переменные:
Dim MyFSO as New FileSystemObject
Dim Folder(32) as Folder
Dim Folders(32,1) as Folders
Dim Files(32,1) as Files
XXX:
Set Folder(1)=MyFSO.GetFolder(MyFSO.GetFolderName(Путь к папке 1 as String))
Folders(1,1).List=Folder(1).SubFolders
Files(1,1).List=Folder(1).Files
И так далее для всех папок.

Через 1 секунду:
Folders(1,2).List=Folder(1).SubFolders
Files(1,2).List=Folder(1).Files
If Folders(1,2)<>Folders(1,1) or Files(1,2)<>Files(1,1) then
Некие события
Else
Folders(1,1)=Folders(1,2)
Files(1,1)=Files(1,2)
И так далее для всех папок.
Goto XXX
Может, где-то орфографическая ошибка, но в общем работает!
...не знаю как там на счет медленых компов... :wink:
Microsoft DirectX - Маломягкий Прямой Х...
Не откладывай на завтра то, что можно выпить сегодня...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 26.09.2003 (Пт) 14:19

И чем это будет отличаться от использования АПИ?

Кроме полнейшей кривизны кода, по моему ничем.



Да, еще я бы не советовал использовать в качестве подписи тексты, которые могут вызвать неприязнь остальных участников форума.

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 07.10.2003 (Вт) 9:37

По-моему мой вариант не так уж плох.У тебя есть другие предложения??? Да, кстати, моя подпись весьма правдива(Я на эту тему ещё поспорю!!!) :cry:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 07.10.2003 (Вт) 10:44

Уважаемый, речь не о правдивости подписи а о ее этичности.

А что касается способа решения проблемы - то есть простой ответ - раз есть стандартные средства, нечего изобретать велосипед.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 2

    TopList