Page 1 sur 1

Vitesse en écriture de votre disque dur

Publié : dim. 14/nov./2004 18:43
par Le Soldat Inconnu
Salut,

un petit utilitaire qui permet de calculer la vitesse en écriture de vos disques dur ;)

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.92
;
; Explication du programme :
; Tester la vitesse en écriture de vos disques dur



;- On cacul la vitesse en écriture du disque dur

Procedure.f HardDisk_WriteSpeed(Lecteur.s)
  If CreateFile(0, Left(Lecteur, 1) + ":\Test disque dur.tmp") ; On crée un fichier de test sur le disque dur concerné
    Mem = AllocateMemory(10 * 1024 * 1024) ; On alloue un espace de 10Mo en mémoire
    
    Temps1 = GetTickCount_()
    
    For n = 1 To 5 ; On écrit 50 Mo dans le fichier (5 * 10Mo)
      WriteData(Mem, 10 * 1024 * 1024)
    Next
    
    Temps2 = GetTickCount_()
    ; Temps1 et Temps 2 serve a mesuré le temps mis pour écrire 50 Mo sur le disque dur
    
    CloseFile(0)
    DeleteFile(Left(Lecteur, 1) + ":\Test disque dur.tmp") ; On supprime le fichier de test
  EndIf
  ProcedureReturn 50 * 1000 / (Temps2 - Temps1) ; On retourne la viteesse en Mo/s
EndProcedure

;- On récupère le nom des disques durs

Structure DriveInfos
  DriveLetter.s
  DriveType.l
  DriveTypeString.s
  NameOfVolume.s
EndStructure
NewList DriveList.DriveInfos()

Procedure GetDrive(ListDriveType.l)
  Protected Drive.s, DriveLetter.s, DriveType.l, Start.l, LengthDrive.l, DriveTypeString.s
  #REMOVABLE_DRIVE = 1
  #FIXED_DRIVE = 2
  #REMOTE_DRIVE = 4
  #CDROM_DRIVE = 8
  #RAMDISK_DRIVE = 16
  #UNKNOWN_DRIVE = 32
  #ALL_DRIVE = 63
  
  ; On vide la liste
  ClearList(DriveList())
  
  ; On récupère la lettre des différents lecteurs présent sur l'ordinateur
  Drive = Space(255)
  LengthDrive = GetLogicalDriveStrings_(255, @Drive)
  
  For Start = 0 To LengthDrive - 4 Step 4
    
    DriveLetter.s = PeekS(@Drive + Start, 3) ; on récupère une lettre
    
    DriveType.l = GetDriveType_(@DriveLetter) ; on récupère le type du lecteur
    
    Select DriveType ; On donne un nom au type de lecteur
      Case #DRIVE_REMOVABLE : DriveType = #REMOVABLE_DRIVE : DriveTypeString.s = "Disquette"
      Case #DRIVE_FIXED : DriveType = #FIXED_DRIVE : DriveTypeString.s = "Disque dur"
      Case #DRIVE_REMOTE : DriveType = #REMOTE_DRIVE : DriveTypeString.s = "Lecteur réseau"
      Case #DRIVE_CDROM : DriveType = #CDROM_DRIVE : DriveTypeString.s = "CD-ROM"
      Case #DRIVE_RAMDISK : DriveType = #RAMDISK_DRIVE : DriveTypeString.s = "RamDisk"
      Case #DRIVE_UNKNOWN : DriveType = #UNKNOWN_DRIVE : DriveTypeString.s = ""
    EndSelect
    
    If DriveType & ListDriveType ; on regarde si le type du lecteur correspond à ceux demandés
      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
      
    EndIf
    
  Next
EndProcedure

;- Procedure de la librairie ColorEffect

Procedure.l ColorLuminosity2(Couleur, Echelle.f) ; Eclaicir ou foncer une couleur
  Protected Rouge, Vert, Bleu
  
  Rouge = Red(Couleur) * Echelle
  Vert = Green(Couleur) * Echelle
  Bleu = Blue(Couleur) * Echelle
  
  If Rouge > 255 : Rouge = 255 : EndIf
  If Vert > 255 : Vert = 255 : EndIf
  If Bleu > 255 : Bleu = 255 : EndIf
  
  ProcedureReturn RGB(Rouge, Vert, Bleu)
EndProcedure




;- Debut de l'exemple

; Création de la fenêtre et de la GadgetList
#WinX = 200
#WinY = 125
#Bordure = 2

If OpenWindow(0, 0, 0, #WinX + 2 * #Bordure, #WinY, #PB_Window_BorderLess | #WS_BORDER | #WS_SYSMENU | #WS_MINIMIZEBOX | #PB_Window_ScreenCentered, "Disque dur") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; Couleur de fond de la fenêtre
Couleur = GetSysColor_(#COLOR_3DFACE)

; Ligne de séparation
CreateImage(0, #WinX, 2)
StartDrawing(ImageOutput())
  Line(0, 0, #WinX, 0, ColorLuminosity2(Couleur, 0.75))
  Line(0, 1, #WinX, 0, ColorLuminosity2(Couleur, 1.25))
StopDrawing()

; Titre
CreateImage(1, #WinX + 2 * #Bordure, 25)
StartDrawing(ImageOutput())
  For n = 0 To 24
    Line(0, n, #WinX + 2 * #Bordure, 0, ColorLuminosity2(Couleur, 1.1 - 0.2 * n / 24))
  Next
  
  ; On dessine le texte du titre
  LoadFont(0, "Arial", 9, #PB_Font_Bold)
  DrawingFont(FontID())
  FrontColor(0, 0, 0)
  DrawingMode(1)
  Locate(3, 5)
  DrawText("Disques durs - Vitesse d'éciture")
  
StopDrawing()

; On affiche les gadgets
ImageGadget(0, 0, 0, #WinX + 2 * #Bordure, 25, UseImage(1))

TextGadget(#PB_Any, #Bordure, 30, #WinX * 1 / 3, 15, "Lecteur :")
ComboBoxGadget(1, #Bordure + #WinX * 1 / 3, 27, #WinX * 2 / 3, 100)
ButtonGadget(2, #Bordure, 51, #WinX, 21, "Lancer")
GadgetToolTip(2, "Lancer le calcul de la vitesse d'écriture sur le disque dur")
DisableGadget(2, 1)
StringGadget(3, #Bordure, 75, #WinX, 20, "", #PB_String_ReadOnly)

ImageGadget(#PB_Any, #Bordure, #WinY - #Bordure * 2 - 21 - 2, #WinX, 2, UseImage(0)) ; Bordure de séparation
ButtonGadget(4, #Bordure, #WinY - #Bordure - 21, #WinX, 21, "Quitter")

; On récupère la liste des disques dur
GetDrive(#FIXED_DRIVE)
; On rempli la liste avec les disques disponibles
ResetList(DriveList())
While NextElement(DriveList())
  AddGadgetItem(1, -1, DriveList()\DriveLetter + " (" + DriveList()\NameOfVolume + ")")
Wend


Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    Select EventGadgetID() ; Gadgets
      Case 2 ; Appui sur le bouton "Lancer"
        If Lecteur.s ; Si un lecteur est sélectionné
          DisableGadget(2, 1) ; On désactive le bouton "Lancer" et le bouton "Quitter"
          DisableGadget(4, 1)
          SetGadgetText(3, "Opération en cours ...") ; On affiche le texte montrant que le calcul est en cours
          UpdateWindow_(WindowID()) ; On force l'actualisatiuon de l'affichage
          SetGadgetText(3, StrF(HardDisk_WriteSpeed(Lecteur), 1) + " Mo/s") ; On affiche la vitesse d'écriture
          DisableGadget(2, 0) ; On active le bouton "Lancer" et le bouton "Quitter"
          DisableGadget(4, 0)
        EndIf
      
      Case 1
        Lecteur = GetGadgetText(1)
        If Lecteur
          DisableGadget(2, 0) ; On rend le bouton "Lancer" utilisable
        EndIf
        
      Case 0 ; On clique sur le titre
        SendMessage_(WindowID(), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) ; On déplace la fenêtre tant que le bouton de la souris reste appuyé
        
      Case 4 ; Appui sur le bouton quitter
        Event = #PB_EventCloseWindow
    EndSelect
  EndIf
  
  
Until Event = #PB_EventCloseWindow

End

Publié : dim. 14/nov./2004 19:15
par erix14
Très jolie...
Et les résultats donnés sont exacts, j'ai vérifié avec HD Tach (ton concurrent :D :D :D )

Publié : lun. 15/nov./2004 23:47
par Le Soldat Inconnu
Par curiosité, ça donne combien chez vous ?

moi j'ai 51mo/s sur C: et 50 sur D: (Disque dur partitionné)

Publié : mar. 16/nov./2004 0:26
par Backup
c : = 53.4 Mo/s

d: = 48.5 Mo/s
:)

partitioné (160 Go )