Определить, изменилось ли содержимое папки? - PullRequest
0 голосов
/ 21 июня 2009

Условия:

  • Windows 98 SE
  • WMI недоступен

У меня есть код, который выглядит следующим образом, написанный с использованием моей стероидной упаковки VBScript с использованием MSScript.

do
    a = files.collectfiles( "c:\userver", "" )
    for i = 0 to ubound( a )
        f = a(i)
        if strings.endswith( f, ".usv" ) then
            d = files.readfilee( f )
            on error resume next
            executeglobal d
            nErr = err.number
            sErr = err.description
            on error goto 0
            if nErr <> 0 then
                trace "*** Error " & nErr & ", " & sErr
            end if
            files.deletefile f
        end if
    next
    system.sleep 10
    system.cooperate
loop

При обращении к файлам files.collectfiles происходит много дисковой активности. Существует ли какой-либо способ обнаружения изменения содержимого папки без фактического сканирования папки на наличие файлов?

Ответы [ 3 ]

2 голосов
/ 21 июня 2009

Существует пример, который утверждает, что работает на всех версиях от Win95 до, как минимум, WinXP. Разработано под Win98 с VB5. Используя недокументированные SHChangeNotify * (тогда? Предоставленные ссылки на документ, приведенный ниже) * Функции.

SHChangeNotifyRegister: получение уведомлений об изменении оболочки

Функция SHChangeNotifyRegister SHChangeNotifyDeregister Function

Существует другое решение, использующее ReadDirectoryChangesW здесь:

VB6 WinAPI ReadDirectory ИзмененияW (см. 5-й пост от Янг Кок Ва)

1 голос
/ 21 июня 2009

Определить «изменение содержимого папки».

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

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

Тем не менее, глядя на то, что вы пытаетесь сделать (сканировать папку на наличие новых файлов .usv, обрабатывать их и удалять их), затем просто отслеживать метку времени в папке и обновлять ее непосредственно перед вызовом. Наиболее подходящим является сборник файлов (обратите внимание, что правильное время для входа в систему - ПРЕЖДЕ, чем вызывать сборщик файлов, в противном случае вы рискуете не проснуться, если файл будет добавлен во время вызова сбора файлов или сразу после него).

0 голосов
/ 21 июня 2009

Вы специально что-то просили в VB и работали на win98, и у меня нет ответа на этот вопрос, но у MS есть пример c / win32 о том, как этого добиться в Windows2000 + с FindFirstChangeNotification . Другое дело, что, очевидно, « FileSystemWatcher » в .NET не работает / не поддерживается на Win98. В чем моя точка зрения? Возможно, для этого нет простого решения, и вам нужно что-то придумать самостоятельно.

...