Surveiller un dossier en tache de fond !

Programmation d'applications complexes
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Surveiller un dossier en tache de fond !

Message 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
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Surveiller un dossier en tache de fond !

Message par G-Rom »

Essaye avec un délais plus long , 10 ms ca fait short , essaye avec une seconde , on est pas presser ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Surveiller un dossier en tache de fond !

Message 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 !
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Surveiller un dossier en tache de fond !

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Surveiller un dossier en tache de fond !

Message par Thyphoon »

Merci Jacobus c'est une tres bonne idée ! je vais voir ce que ça donne !! :o)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Surveiller un dossier en tache de fond !

Message 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
Image
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Surveiller un dossier en tache de fond !

Message par nico »

Sinon, il existe des API FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Surveiller un dossier en tache de fond !

Message par Thyphoon »

Merci je fais des tests, si j'arrive a quelques choses qui marche vraiment bien je posterais le code ! :o)
Répondre