Page 1 sur 1

Surveiller un dossier en tache de fond !

Publié : lun. 05/avr./2010 18:34
par Thyphoon
Bonjour,

Voici un petit code qui scan un répertoire pour le surveiller !
Le but est de faire quelques choses comme pour Picasa ou Songbird qui détecte lorsqu'un fichier est rajouter/déplacer/effacer pour mettre a jour la base de donnée. Le souci c'est que le disque dur n'arrête pas de tourner avez vous une idée de comment c'est fait généralement ? pour ne pas user le disque dur lorsque l'application tourne en permanence sur un ordi ?
Pour tester changer la valeur du Directory$ avec un chemin vers un répertoire avec pas trop de truc. rajouter un fichier ou retirer, normalement ça doit être indiquer dans le debugger !

Code : Tout sélectionner

Directory$ = "Z:\Test"   ; Lists all entries in the Windows directory (without the contents of sub-directories)

Structure File
  File.s
  Checked.b
EndStructure

Global NewList FileDb.File()


Procedure Check(File.s)
  Found=#False 
  ForEach FileDb()
    If File=FileDb()\File
      Found=#True  
      FileDb()\checked=#True
    EndIf
  Next
  If Found=#False
    Debug "New File:"+File
    AddElement(FileDb())
    FileDb()\File=File
    FileDb()\checked=#True
  EndIf
EndProcedure

Procedure ScanDirectory(Path.s="",N.l=0)
  If N=0
    ForEach FileDb()
      FileDb()\checked=#False
    Next
  EndIf
  
  
  If ExamineDirectory(N, Path, "*.*")  
      While NextDirectoryEntry(N)
        If DirectoryEntryType(N) = #PB_DirectoryEntry_File
          Check(Path+"\"+DirectoryEntryName(N))
        ElseIf DirectoryEntryName(N)<>".." And DirectoryEntryName(N)<>"."
          ScanDirectory(Path+"\"+DirectoryEntryName(N),N+1)
        EndIf
        
        
      Wend
      FinishDirectory(N)
    EndIf
    
    If N=0
      ForEach FileDb()
        If FileDb()\checked=#False
          Debug "Delete :"+FileDb()\File
          DeleteElement(FileDb())
        EndIf
    Next
  EndIf 
    
  EndProcedure
  
  
  
  Procedure Scan(a)
    Repeat
      Delay(10)
      Directory$ = "Z:\Yann\Backup" 
      ScanDirectory(Directory$)
    ForEver
  EndProcedure
  
  CreateThread(@Scan(), 0)
  
  If OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
 Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

Re: Surveiller un dossier en tache de fond !

Publié : lun. 05/avr./2010 18:43
par G-Rom
Essaye avec un délais plus long , 10 ms ca fait short , essaye avec une seconde , on est pas presser ;)

Re: Surveiller un dossier en tache de fond !

Publié : lun. 05/avr./2010 20:27
par Thyphoon
oui je crois que je vais mettre même une minute :P
mais existe t'il une autre façon de détecter en temps reel les modifications dans un dossier !

Re: Surveiller un dossier en tache de fond !

Publié : lun. 05/avr./2010 23:23
par Jacobus
En utilisant un ExplorerListGadget() qui se met à jour en temps réel automatiquement.
Tu comptes le nombre d'éléments avec CountGadgetItems()
Dans un timer tu vérifies que ce compte d'éléments ne change pas. S'il change tu mets ta base de données à jour via un thread.
Le tout en mode Hide
A faire pour chaque dossier à vérifier, le compte des éléments n'étant valable que pour un seul dossier à la fois.

Bon, c'est juste une astuce qui m'est passée par la tête. A voir si c'est viable comme prog.

Re: Surveiller un dossier en tache de fond !

Publié : mar. 06/avr./2010 7:15
par Thyphoon
Merci Jacobus c'est une tres bonne idée ! je vais voir ce que ça donne !! :o)

Re: Surveiller un dossier en tache de fond !

Publié : mar. 06/avr./2010 11:03
par TazNormand
Salut

Je ne sais pas comment mettre cela en place, mais tu peux essayer aussi de "charger" la table d'allocations des fichiers régulièrement et de comparer avec ton chargement précédent.

c'est à mon avis moins lourd que de recharger le contenu d'un répertoire dans une liste, mais sans doute pas évident à mettre en place

Re: Surveiller un dossier en tache de fond !

Publié : ven. 09/avr./2010 20:09
par nico
Sinon, il existe des API FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification.

Re: Surveiller un dossier en tache de fond !

Publié : ven. 09/avr./2010 20:55
par Thyphoon
Merci je fais des tests, si j'arrive a quelques choses qui marche vraiment bien je posterais le code ! :o)