Как узнать, что появился новый (изменился) файл в директории

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
eteP
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.02.2004 (Пн) 18:14

Как узнать, что появился новый (изменился) файл в директории

Сообщение eteP » 16.02.2004 (Пн) 18:22

Привет

Есть такая проблема subj.
Ни как не могу найти информацию по этому вопросу.
Перечитывать всю директорию по таймеру и сравнивать что изменилось, занимает слишком много времени (очень много файлов в ней).
Нашел в msdn windows shell. Как все это прикрутить к VB не понятно.

Подскажите плз.

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 16.02.2004 (Пн) 18:32

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

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 16.02.2004 (Пн) 18:33

Расширения оболочки? Читай www.rsdn.ru. На VC++. На VB6 как это сделать я пока не совсем себе представляю.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

eteP
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.02.2004 (Пн) 18:14

Сообщение eteP » 16.02.2004 (Пн) 18:44

Этот сайт я уже просматрел, спасибо.

Если посмотреть в компонентах->контролы в VB то там есть Shell32.dll "Microsoft Shell Controls And Automation". Посмотрев что в ней есть по F2 мало что понял. Где-бы описание надыбать, а то методом тыка как-то долго будет.


2 XPraptor спасибо за предложенный метод, только это опять читать все файлы, что хотелось бы исбежать.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 17.02.2004 (Вт) 0:49

скорость обработки значительно уменьшается если у всех элементов DIR и FILE боксов сделать свойство Visibled = False
А последняя модификация папки - верный варинт ... ростой и эффективный. Иначе никак. Никто тебе не даст функции, которая выдает список файлов измененных ... или же отслеживай любой процес на машине.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 17.02.2004 (Вт) 1:27

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

eteP
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.02.2004 (Пн) 18:14

Сообщение eteP » 17.02.2004 (Вт) 15:03

2 Kostyan
Если не сложно можешь выслать на мыло prosto_taaak сабака yahoo.de?
Было бы очень интерестно посмотреть как это сделать, я думаю что это подайдет.
Спасибо

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 17.02.2004 (Вт) 16:40

Я выслал пример тебе на мыло, но на всякий случай выложу и тут
Вложения
Notif.rar
Перехват сообщений о изменениях в файловой системе.
(2.61 Кб) Скачиваний: 178
Нет ничего невозможного для человека с интеллектом.

eteP
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.02.2004 (Пн) 18:14

Сообщение eteP » 18.02.2004 (Ср) 21:51

Всем привет
Я сделал наконец прогу, которая отслеживает файлы в директории.
Спасибо большое Kostyan за идею.
Вложения
ReadDirectoryChanges.rar
Тестовая прога
(4.92 Кб) Скачиваний: 229

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 19.02.2004 (Чт) 1:31

Круто! 8)
Есть одно но, ф-я ReadDirectoryChangesW работает только на платформе NT, так что на Win9x прога не пойдёт...
Нет ничего невозможного для человека с интеллектом.

eteP
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 16.02.2004 (Пн) 18:14

Сообщение eteP » 19.02.2004 (Чт) 13:22

На самом деле там много всякого "но".
Для 9х я думаю можно пользовать твой код + shell32.dll для того что бы найти те файлы которые были удалены\добавлены\изменены.
Я так уже пробывал делать, работает довольно быстро. Из 3000 файлов нахоится нужный(-ые) файлы меньше чем за секунду (время на глаз).


Пока у меня не получилось ReadDirectoryChangesW заставить работать по CALLBACK, не вызывает ее и все тут.
Видать где-то туплю. Но работа идет в этом направлении.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 25.02.2004 (Ср) 20:38

Я, конечно, не уверен, но, по-моему, кто-то плохо смотрит в API-Guide :roll::

Код: Выделить всё
Private Const FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4
Private Const FILE_NOTIFY_CHANGE_DIR_NAME = &H2
Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
Private Const FILE_NOTIFY_CHANGE_SIZE = &H8
Private Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10
Private Const FILE_NOTIFY_CHANGE_SECURITY = &H100
Private Const FILE_NOTIFY_CHANGE_ALL = &H4 Or &H2 Or &H1 Or &H8 Or &H10 Or &H100
Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim Ret As Long
    'Set the notification hook
    Ret = FindFirstChangeNotification("C:\", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL)
    'Wait until the event is triggered
    WaitForSingleObject Ret, &HFFFFFFFF
    MsgBox "Event Triggered for the first time"
    'Reactivate our hook
    FindNextChangeNotification Ret
    'Wait until the event is triggered
    WaitForSingleObject Ret, &HFFFFFFFF
    MsgBox "Event Triggered for the second time"
    'Remove our hook
    FindCloseChangeNotification Ret
End Sub

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 26.02.2004 (Чт) 1:03

To Amed: А по-моему кто-то плохо читает посты. Вообще-то скачай мою программу и посмотри что там написано, ты будешь удивлён, но в ней используется тот же метод, что и у тебя.
Нет ничего невозможного для человека с интеллектом.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 26.02.2004 (Чт) 16:11

Код: Выделить всё
Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long

Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Public Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
Public Const FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4
Public Const FILE_NOTIFY_CHANGE_DIR_NAME = &H2
Public Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10
Public Const FILE_NOTIFY_CHANGE_SECURITY = &H100
Public Const FILE_NOTIFY_CHANGE_SIZE = &H8

Public Const INFINITE = &HFFFF

Global Chet As Integer

Function Uzn() As Long
  Dim Fl As Long, St As Long
  Fl = FindFirstChangeNotification("c:\t\", False, FILE_NOTIFY_CHANGE_FILE_NAME)
  St = WaitForSingleObject(Fl, INFINITE)
  FindCloseChangeNotification Fl
  Uzn = St
End Function


Здесь вместо константы INFINITE (с её помощью вызов функции будет длится пока не произойдёт какое-то изменение в наблюдаемой папке) можно вставить колличество милисекунд.

Один минус, нельзя определить какой именно файл был удалён, изменён или редатирован. :cry:
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 26.02.2004 (Чт) 16:55

Люди, есть прога FILEMON.EXE не помню где скачивал, но на нее там и исходники были. Она следит за любыми изменениями файлов в указанных папках. Написана на VB. Я постоянно ей пользуюсь, вот только исходники я тогда не закачивал, а теперь не могу вспомнить где ее нашел.
Если руки кривые, то не надо ругать разработчиков.

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 26.02.2004 (Чт) 18:48

во надыбал .OCX который следит за указанными папками http://www.vbnet.ru/activex/zip/mbshspy.zip
Если руки кривые, то не надо ругать разработчиков.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 35

    TopList