Nombre et taille des élements dans la corbeille

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Nombre et taille des élements dans la corbeille

Message par Le Soldat Inconnu »

Pour récupérer la nombre d'élément dans la corbeille, et la taille que cela représente.

le code peut parètre long mais il contient plusieurs choses :
- La recherche de tous les lecteurs sur le disque dur car il faut analyser la corbeille pour chaque disque dur
- L'affichage de la taille sous forme de texte avec mise à l'échelle auto

Code : Tout sélectionner

; Auteur : le Soldat Inconnu
; Version de PB : 4
; 
; Explication du programme :
; Obtenir des informations sur le contenu de la corbeille

Structure DriveInfos
  DriveLetter.s
  DriveType.l
  DriveTypeString.s
  NameOfVolume.s
EndStructure
Global NewList DriveList.DriveInfos()
Procedure GetDrive()
  Protected Drive.s, DriveLetter.s, DriveType.l, Start.l, LengthDrive.l, DriveTypeString.s
  
  ClearList(DriveList())
  
  Drive = Space(255)
  LengthDrive = GetLogicalDriveStrings_(255, @Drive)
  
  For Start = 0 To LengthDrive - 4 Step 4
    
    DriveLetter.s = PeekS(@Drive + Start, 3)
    
    DriveType.l = GetDriveType_(@DriveLetter)
    
    Select DriveType
      Case #DRIVE_REMOVABLE : DriveTypeString.s = "Disquette"
      Case #DRIVE_FIXED : DriveTypeString.s = "Disque dur"
      Case #DRIVE_REMOTE : DriveTypeString.s = "Lecteur réseau"
      Case #DRIVE_CDROM : DriveTypeString.s = "CD-ROM"
      Case #DRIVE_RAMDISK : DriveTypeString.s = "RamDisk"
      Case #DRIVE_UNKNOWN : DriveTypeString.s = ""
    EndSelect
    
    AddElement(DriveList())
    DriveList()\DriveLetter = RemoveString(DriveLetter, "\")
    DriveList()\DriveType = DriveType
    DriveList()\DriveTypeString = DriveTypeString
    
    If DriveLetter <> "A:\" And DriveLetter <> "B:\"
      DriveList()\NameOfVolume = Space(255)
      GetVolumeInformation_( @DriveLetter, @DriveList()\NameOfVolume, 255, 0, 0, 0, 0, 0)
      DriveList()\NameOfVolume = Trim(DriveList()\NameOfVolume)
    Else
      DriveList()\NameOfVolume = ""
    EndIf
    
  Next
EndProcedure

Procedure.s DisplaySize(Taille.q, Unite.l, NbDecimals.l)
  ; Affiche une taille sous forme de texte
  
  ; Taille = taille du lecteur
  ; Unite = unité de la taille, 0 = Octect, 1 = Ko, 2 = Mo, 3 = Go. Si = -1, Le choix de l'unité et du nombre de décimal sera automatique
  ; NbDecimals = nombre de chiffre après la virgule.
  
  Protected Val.q, Txt.s
  
  If Unite = -1
    NbDecimals = 0 : Unite = 0
    If Taille >= 1000 : Unite = 1 : NbDecimals = 2 : EndIf ; 0.00 Ko
    If Taille >= 10000 : Unite = 1 : NbDecimals = 1 : EndIf ; 000.0 Ko
    If Taille >= 1000000 : Unite = 2 : NbDecimals = 2 : EndIf ; 0.00 Mo
    If Taille >= 10000000 : Unite = 2 : NbDecimals = 1 : EndIf ; 000.0 Mo
    If Taille >= 1000000000 : Unite = 3 : NbDecimals = 2 : EndIf ; 0.00 Go
    If Taille >= 10000000000 : Unite = 3 : NbDecimals = 1 : EndIf ; 000.0 Go
  EndIf
  Select Unite
    Case 0 : Val = 1 : Txt = " octects"
    Case 1 : Val = 1024 : Txt = " Ko"
    Case 2 : Val = 1024 * 1024 : Txt = " Mo"
    Case 3 : Val = 1024 * 1024 * 1024 : Txt = " Go"
  EndSelect
  ProcedureReturn StrF(Taille / Val, NbDecimals) + Txt
  
EndProcedure

Procedure Corbeille()
  Structure SHQUERYRBINFO
    cbSize.l
    Size.q
    numItems.q
  EndStructure
  Protected Corbeille.SHQUERYRBINFO, Taille.q, Element.q
  GetDrive() ; On récupère tous les lecteurs de l'ordinateur
  If OpenLibrary(0, "shell32.dll")
    Corbeille\cbSize = SizeOf(SHQUERYRBINFO)
    ForEach DriveList()
      If DriveList()\DriveType = #DRIVE_FIXED ; Si il s'git d'un disuqe dur, on regarde le contenu de la corbeille
        If CallFunction(0, "SHQueryRecycleBinA", DriveList()\DriveLetter + ":\", @Corbeille) = #S_OK ; On récupère les informations sur la corbeille
          Taille + Corbeille\Size
          Element + Corbeille\numItems
        EndIf
      EndIf
    Next
    ; On affiche le résultat
    MessageRequester("Corbeille", Str(Element) + " élément(s) dans la Corbeille [ " + DisplaySize(Taille, -1, 0) + " ]")
    CloseLibrary(0)
  EndIf
EndProcedure

Corbeille()
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Peut être utile pour intégrer à une application. Ce qui serait bien c'est de pouvoir agir directement sur les fichiers dans la corbeille.
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.
Répondre