Page 1 sur 1

[v4 beta 11] DeleteDirectory() [corrigé]

Publié : jeu. 06/avr./2006 12:23
par Jacobus
Cet exemple d'utilisation me retourne 0 à chaque fois !?

Code : Tout sélectionner

Case #Menu_DeletedIR; menu popup
          Position_Popup      = GetGadgetState(#ExplorerListGadget)
          If Position_Popup  >= 0 
            ResultDir    = GetGadgetItemState(#ExplorerListGadget,Position_Popup)
            Repertoire$  = GetGadgetText(#ExplorerListGadget)+GetGadgetItemText(#ExplorerListGadget, Position_Popup, 0)
                    Debug Repertoire$
            If Repertoire$<>""
              If FileSize(Repertoire$)= -2
                 Resultat = DeleteDirectory(Repertoire$,"*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
                 If Resultat <>0
                    Debug "OK"
                 Else 
                    Debug "NO"
                    MessageRequester("ERREUR", "TU PEUX TOUJOURS TE BROSSER !!", #MB_ICONEXCLAMATION)
                 EndIf 
              EndIf 
            EndIf 
          EndIf 
Une idée ?

Publié : jeu. 06/avr./2006 16:55
par Fred
T'as essayé uniquement avec '*' comme filtre ?

Publié : jeu. 06/avr./2006 18:43
par Jacobus
Oui, en prenant tous les types je pensais éliminer les problèmes.

J'ai fais un exemple (ci-dessous) qui fonctionne "presque" toujours. Mais je me demande si ce n'est pas lié à l'affichage. Si les fichiers ou dossiers sont affichés dans plusieurs explorateurs, le système considère peut-être qu'ils sont en cours d'utilisation et refuse alors de les supprimer. Le bean's, c'est que ça ne le fais pas à tous les coups.

Par contre, magré que j'utilise la même façon de procéder dans mon prog plus complexe, les répertoires refusent obstinément d'être supprimés. ?! Je ne trouve pas les interférences avec les autres fonctions...bref, je blaire un max :(

Voici le test sur 2 ExplorerListGadget()

Code : Tout sélectionner

Enumeration 
  #win
  #ExplorerFiles
  #PopUp
  #Menu_File
  #Menu_Delete
  #Menu_BackUp
  
  #ExplorerBackUp
  #PopUpBackUp
  #Menu_FileBackUp
  #Menu_DeleteBackUp
  EndEnumeration 
  
  If ExamineDirectory(0, "c:\BackUp_Test", "*.*") = 0
  BackUp_directory = CreateDirectory("c:\BackUp_Test") 
  EndIf 
  
  ExamineDesktops()
  Largeur$ = Str(DesktopWidth(0))
  Hauteur$ = Str(DesktopHeight(0))
  If Val(Largeur$)>800 And Val(Hauteur$)>600
    FlagWin = #PB_Window_SystemMenu  | #PB_Window_ScreenCentered |#PB_Window_TitleBar
  Else 
    FlagWin = #PB_Window_SystemMenu  |#PB_Window_TitleBar
  EndIf 
  
  ww = 790 : wh = 550
  Hwnd = OpenWindow(#win,0,0, ww, wh, "Window - Tests", FlagWin)
  If Hwnd = 0 Or CreateGadgetList(WindowID(#win))=0  
    End 
  EndIf
  If CreatePopupMenu(#PopUp)
    MenuItem(#Menu_File, "Fichier")
    MenuBar()
    MenuItem(#Menu_Delete,"Supprimer")
    MenuBar()
    MenuItem(#Menu_BackUp,"Faire une copie de sauvegarde")
  EndIf  
  If CreatePopupMenu(#PopUpBackUp)
    MenuItem(#Menu_FileBackUp, "Fichier")
    MenuBar()
    MenuItem(#Menu_DeleteBackUp,"Supprimer")
  EndIf 
  
  Dossier$="c:\"
  ExplorerListGadget(#ExplorerFiles,5,5, 780, 250, Dossier$,#PB_Explorer_AlwaysShowSelection)
  ChangeListIconGadgetDisplay(#ExplorerFiles, #PB_ListIcon_LargeIcon)
  
  ExplorerListGadget(#ExplorerBackUp,5,260, 780, 250, "c:\BackUp_Test\",#PB_Explorer_AlwaysShowSelection)
  ChangeListIconGadgetDisplay(#ExplorerBackUp, #PB_ListIcon_LargeIcon)
  
Repeat  
  Select WaitWindowEvent() 
    Case #PB_Event_Gadget  
      Select EventGadget()
      
      Case #ExplorerFiles 
          Select EventType()            
            Case #PB_EventType_RightClick
              PositionPopup      = GetGadgetState(#ExplorerFiles)
              If PositionPopup  >= 0 
                 Resultat        = GetGadgetItemState(#ExplorerFiles,PositionPopup)
                 SelectElement$  = GetGadgetText(#ExplorerFiles)+GetGadgetItemText(#ExplorerFiles, PositionPopup, 0)
                 SetMenuItemText(#PopUp,#Menu_File,"Fichier :  "+GetFilePart(SelectElement$))
                 DisplayPopupMenu(#PopUp,WindowID(#Win))
              EndIf  
           EndSelect   
           
       Case #ExplorerBackUp 
          Select EventType()            
            Case #PB_EventType_RightClick
              PositionPopup      = GetGadgetState(#ExplorerBackUp)
              If PositionPopup  >= 0 
                 Resultat        = GetGadgetItemState(#ExplorerBackUp,PositionPopup)
                 SelectBackUp$  = GetGadgetText(#ExplorerBackUp)+GetGadgetItemText(#ExplorerBackUp, PositionPopup, 0)
                 SetMenuItemText(#PopUpBackUp,#Menu_FileBackUp,"Fichier :  "+GetFilePart(SelectBackUp$))
                 DisplayPopupMenu(#PopUpBackUp,WindowID(#Win))
              EndIf  
           EndSelect      
                  
     EndSelect 
     
    Case #PB_Event_Menu 
      Select EventMenu()
      
      ;Case #Menu_File
      
      Case #Menu_Delete
       PositionPopup         = GetGadgetState(#ExplorerFiles)
          If PositionPopup  >= 0 
            FileState = GetGadgetItemState(#ExplorerFiles,PositionPopup)
            File$     = GetGadgetText(#ExplorerFiles)+GetGadgetItemText(#ExplorerFiles, PositionPopup, 0)
            If File$<>""
            
               If FileState & #PB_Explorer_Directory
                 Suppression = DeleteDirectory(File$,"*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
                 If Suppression <>0
                    MessageRequester("OK", "Répertoire supprimé", #MB_ICONINFORMATION)
                 Else 
                    MessageRequester("ERREUR", "Impossible de supprimer ce répertoire", #MB_ICONEXCLAMATION)
                 EndIf 
              EndIf 
              
              If FileState & #PB_Explorer_File
                 Suppression = DeleteFile(File$)
                 If Suppression <>0
                    MessageRequester("OK", "Fichier supprimé", #MB_ICONINFORMATION)
                 Else 
                    MessageRequester("ERREUR", "Impossible de supprimer ce fichier", #MB_ICONEXCLAMATION)
                 EndIf 
              EndIf 
              
            EndIf 
          EndIf 
          
      Case #Menu_BackUp
        PositionPopup         = GetGadgetState(#ExplorerFiles)
          If PositionPopup  > = 0 
            FileState = GetGadgetItemState(#ExplorerFiles,PositionPopup)          
            ToBackUp$ = GetGadgetText(#ExplorerFiles)+GetGadgetItemText(#ExplorerFiles, PositionPopup, 0)
            If FileState & #PB_Explorer_Directory
               BackUp = CopyDirectory(ToBackUp$, "c:\BackUp_Test\"+GetFilePart(ToBackUp$), "*.*" ,#PB_FileSystem_Recursive|#PB_FileSystem_Force)
               SetGadgetText(#ExplorerBackUp, "c:\BackUp_Test\")
            ElseIf FileState & #PB_Explorer_File
               BackUp = CopyFile(ToBackUp$, "c:\BackUp_Test\"+GetFilePart(ToBackUp$)) 
               SetGadgetText(#ExplorerBackUp, "c:\BackUp_Test\")
            EndIf 
           EndIf 
      
      
      Case #Menu_DeleteBackUp
       PositionPopup         = GetGadgetState(#ExplorerBackUp)
          If PositionPopup  >= 0 
            FileState = GetGadgetItemState(#ExplorerBackUp,PositionPopup)
            FileBackUp$     = GetGadgetText(#ExplorerBackUp)+GetGadgetItemText(#ExplorerBackUp, PositionPopup, 0)
            If FileBackUp$<>""
            
              If FileState & #PB_Explorer_Directory
                 Suppression = DeleteDirectory(FileBackUp$,"*.*",#PB_FileSystem_Recursive|#PB_FileSystem_Force)
                 If Suppression <>0
                    MessageRequester("OK", "Répertoire supprimé", #MB_ICONINFORMATION)
                    SetGadgetText(#ExplorerBackUp, "c:\BackUp_Test\")
                 Else 
                    MessageRequester("ERREUR", "Impossible de supprimer ce répertoire", #MB_ICONEXCLAMATION)
                 EndIf 
              EndIf 
              
              If FileState & #PB_Explorer_File
                 Suppression = DeleteFile(FileBackUp$)
                 If Suppression <>0
                    MessageRequester("OK", "Fichier supprimé", #MB_ICONINFORMATION)
                    SetGadgetText(#ExplorerBackUp, "c:\BackUp_Test\")
                 Else 
                    MessageRequester("ERREUR", "Impossible de supprimer ce fichier", #MB_ICONEXCLAMATION)
                 EndIf 
              EndIf 
              
            EndIf 
          EndIf 
       
       
      EndSelect 
      
    Case #PB_Event_CloseWindow :Quitter = 1
           
  EndSelect  
  
Until Quitter
End 
          
          
Alors que je n'ai pas rencontré de problème avec un bouton, les menus et popupmenus posent problème. Cela vient peut-être de la récupération du chemin du fichier/dossier dans les menus...

Publié : lun. 10/avr./2006 9:31
par Jacobus
Bon, je sais maintenant pourquoi la suppression ne peut se faire.

C'est que le système trouve un programme autre qui utilise le fichier ou la ressource et, normalement, empêche sa suppression.

Le problème c'est que hormis l'application PB en cours qui affiche le dossier ou fichier, celui-ci n'est utilisé nulle part ailleurs. Il semble donc que le simple fait de sélectionner un dossier dans l'ExplorerListGadget(), le rend insupprimable car considéré en cours d'utilisation :!:
Et le plus affreux dans tout ça, c'est que ça n'arrive pas toujours... :(
Aurais tu une solution?

Le problème n'existe pas avec les "copies" (voir code d'exemple dans post précédent) qui sont facilement supprimées.

PS: j'ai remarqué que l'ExplorerListGadget() s'actualise automatiquement depuis PB4, sans qu'il soit nécessaire d'utiliser SetGadgetText(), pratique.

Publié : lun. 10/avr./2006 16:18
par Fred
Tu as raison, c'est l'explorerlistgadget() qui empeche la suppression, a cause du monitoring qui est installé dessus (pour la réactualisation automatique justement). Je vais jetter un oeil dessus.

Publié : dim. 16/avr./2006 16:48
par Jacobus
:) Je vois que tu as fait pas mal de corrections, super.
J'en profite pour remonter ce sujet, le problème me fait cruellement défaut, merci.

Publié : dim. 16/avr./2006 22:31
par Backup
Jacobus a écrit ::) Je vois que tu as fait pas mal de corrections, super.
J'en profite pour remonter ce sujet, le problème me fait cruellement défaut, merci.
j'avais deja parler de ce probleme sur Nono

la Dll ne pouvais pas effacer un fichier, car il semblait locké par le prg principale , j'ai resolu le problem en le contournant, et en creant a chaque fois un fichier *.Tmp avec un nom different ce qui permet d'effacer le fichier precedant , puisqu'il n'est plus le dernier utiliser par le prg principal ... :?

voir ici !! http://purebasic.forum-gratuit.com/viewtopic.php?t=2762

Publié : dim. 16/avr./2006 23:06
par Jacobus
Oui en effet je me souviens de ton post (encore plus en le relisant)

Il semble bel et bien que ce soit l'ExplorerListGadget() qui déconne. Pour afficher les dossiers il semble les utiliser et tu peux essayer ce que tu veux, il refuse de les supprimer.

Le plus étrange, dans l'exemple de code que j'ai donné, tu as le premier explorateur dans lequel DeleteDirectory() ne fonctionne pas, mais DeleteFile() lui marche très bien et dans le second explorateur, où les copies sont envoyées, là pas de problème, tout peut-être supprimé et avec la même procédure. :!: :?:

c'est fâcheux...

Publié : lun. 17/avr./2006 17:36
par Jacobus
Fred, j'ai constaté que le problème ne survient pas avec Win 98 / Me / 9x où les dossiers et fichiers sont supprimés correctement, mais l'actualisation automatique de l'ExplorerListGadget() ne se fait pas, il faut utiliser SetGadgetText() pour ça.

Publié : jeu. 04/mai/2006 10:40
par Fred
C'est corrigé.

Publié : jeu. 04/mai/2006 11:06
par Jacobus
:D Merci !
Je vais pouvoir mettre à jour.
J'avoue que ça fait du bien une bonne nouvelle.