Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    752

    [VB6] controllare cambiamento directory

    Ciao
    Ho trovato uno script in rete che mi permette di segnalare un inserimento di un file all'inteno di un folder.
    Non capisco perchè lancia il MsgBox 2 volte anche quando il file inserito è solo 1.
    Ecco il mio script:

    Option Explicit

    Dim hChangeHandle As Long
    Dim hWatched As Long
    Dim terminateFlag As Long

    Private Const FILE_NOTIFY_CHANGE_LAST_WRITE As Long = &H10
    Private Const FILE_NOTIFY_FLAGS = FILE_NOTIFY_CHANGE_LAST_WRITE

    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 Const WAIT_OBJECT_0 As Long = &H0
    Private Const WAIT_ABANDONED As Long = &H80
    Private Const WAIT_IO_COMPLETION As Long = &HC0
    Private Const WAIT_TIMEOUT As Long = &H102
    Private Const STATUS_PENDING As Long = &H103

    Private Sub Form_Load()
    Label2.Caption = "Press 'Begin Watch'"
    End Sub

    Private Sub Command1_Click()
    Dim watchPath As String
    Dim watchStatus As Long
    watchPath = "D:\Fabio"
    terminateFlag = False
    Command1.Enabled = False

    Label2.Caption = "CAHNGE "

    'get the first file text attributes to the listbox (if any)
    WatchChangeAction watchPath

    'create a watched directory
    hWatched = WatchCreate(watchPath, FILE_NOTIFY_FLAGS)

    'poll the watched folder
    watchStatus = WatchDirectory(hWatched, 100)

    'if WatchDirectory exited with watchStatus = 0,
    'then there was a change in the folder.
    If watchStatus = 0 Then

    'update the listbox for the first file found in the
    'folder and indicate a change took place.
    WatchChangeAction watchPath
    Do
    watchStatus = WatchResume(hWatched, 100)

    WatchChangeAction watchPath
    MsgBox "The watched directory has been changed again."

    '(perform actions)
    'this is where you'd actually put code to perform a
    'task based on the folder changing.

    ' End If

    Loop While watchStatus = 0

    Else
    'watchStatus must have exited with the terminate flag
    'MsgBox "Watching has been terminated for " & watchPath

    End If

    End Sub

    Private Sub Command2_Click()

    'clean up by deleting the handle to the watched directory
    Call WatchDelete(hWatched)
    hWatched = 0

    Command1.Enabled = True
    Label2.Caption = "Press 'Begin Watch'"

    End Sub


    Private Sub Command3_Click()

    If hWatched > 0 Then Call WatchDelete(hWatched)
    Unload Me

    End Sub


    Private Function WatchCreate(lpPathName As String, flags As Long) As Long

    'FindFirstChangeNotification members:
    '
    ' lpPathName: folder to watch
    ' bWatchSubtree:
    ' True = watch specified folder and its sub folders
    ' False = watch the specified folder only
    ' flags: OR'd combination of the FILE_NOTIFY_ flags to apply

    WatchCreate = FindFirstChangeNotification(lpPathName, False, flags)

    End Function


    Private Sub WatchDelete(hWatched As Long)

    terminateFlag = True
    DoEvents

    Call FindCloseChangeNotification(hWatched)

    End Sub


    Private Function WatchDirectory(hWatched As Long, interval As Long) As Long

    'Poll the watched folder.
    'The Do..Loop will exit when:
    ' r = 0, indicating a change has occurred
    ' terminateFlag = True, set by the WatchDelete routine

    Dim r As Long

    Do

    r = WaitForSingleObject(hWatched, interval)
    DoEvents

    Loop While r <> 0 And terminateFlag = False

    WatchDirectory = r

    End Function


    Private Function WatchResume(hWatched As Long, interval) As Boolean

    Dim r As Long

    r = FindNextChangeNotification(hWatched)

    Do

    r = WaitForSingleObject(hWatched, interval)
    DoEvents

    Loop While r <> 0 And terminateFlag = False

    WatchResume = r

    End Function


    Private Sub WatchChangeAction(fPath As String)

    Dim fName As String

    With List1

    .Clear

    fName = Dir(fPath & "\" & "*.txt")

    If Len(fName) > 0 Then

    .AddItem "path: " & vbTab & fPath
    .AddItem "file: " & vbTab & fName
    .AddItem "size: " & vbTab & FileLen(fPath & "\" & fName)
    .AddItem "attr: " & vbTab & GetAttr(fPath & "\" & fName)

    End If
    End With

    End Sub
    Comunque Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quale dei due MsgBox lancia due volte?

    P.S. Piu' volte ti hanno detto di usare i tag CODE per postare il codice ... e' difiicile?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    752
    Ciao e grazie per l'aiuto.

    MsgBox "The watched directory has been changed again."
    è quello che si ripete.

    Scusa la mia impreparazione ma sono agli inizi e non so cosa sono i Tag Code.
    Comunque Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.