Page 1 sur 1

Récupérer les lecteurs disques

Publié : dim. 19/juin/2011 19:11
par anissa
Bonjour,

Je l'ai vu quelque part mais je ne sais plus où c'est:

Comment récupérer (ou détecter) les lecteurs logiques des disques d'un pc ?
(Exemple c:\ d:\ e:\ etc...)

2ème question sur les bases de données sqlite:

Y a t-il une limite (taille maxi en octet) au niveau du contenu d'une table? Si oui, laquelle ?

Merci

Re: Récupérer les lecteurs disques

Publié : dim. 19/juin/2011 22:24
par falsam
Chaque enregistrement d'une table est systématiquement indexé par une clé primaire représenté par un entier 64 bits signé. Il est donc possible d'insérer plusieurs millions d'enregistrements dans une seule table.

J'ai utiliser une base de données de plus de 150 000 contacts sans aucun problème de navigation et de mise à jour.

L'expression select * from 'nomtable' ne donne pas la valeur de l'index principal d'un enregistrement.
Il faut utiliser à la place Select rowid, * from 'nomtable'

Re: Récupérer les lecteurs disques

Publié : dim. 19/juin/2011 22:37
par falsam
anissa a écrit :Bonjour,

Je l'ai vu quelque part mais je ne sais plus où c'est:

Comment récupérer (ou détecter) les lecteurs logiques des disques d'un pc ?
(Exemple c:\ d:\ e:\ etc...)
Le Soldat Inconnu a effectivement posté quelques lignes de codes sur ce sujet.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer la lettre et le type (disquette, disque dur, etc...) de tous les lecteurs présents sur l'ordinateur.



Procedure GetDrive(Search_Type.l = -1)
  Structure DriveInfos
    Letter.s
    Type.l
    Name.s
  EndStructure
  Global NewList Drive.DriveInfos()
  
  ; Value for Search_Type :
  ; 
  ; DRIVE_UNKNOWN
  ; 0
  ; The Drive Type cannot be determined.
  ; 
  ; DRIVE_NO_ROOT_DIR
  ; 1
  ; The root Path is invalid; for example, there is no volume is mounted at the path.
  ; 
  ; DRIVE_REMOVABLE
  ; 2
  ; The Drive has removable media; for example, a floppy drive, thumb drive, or flash card reader.
  ; 
  ; DRIVE_FIXED
  ; 3
  ; The Drive has fixed media; for example, a hard drive or flash drive.
  ; 
  ; DRIVE_REMOTE
  ; 4
  ; The Drive is a remote (network) Drive.
  ; 
  ; DRIVE_CDROM
  ; 5
  ; The Drive is a CD-ROM Drive.
  ; 
  ; DRIVE_RAMDISK
  ; 6
  ; The drive is a RAM disk.
  
  Protected DriveString_Length.l, DriveString.l, DriveIndex.l, FileInfo.SHFILEINFO
  
  
  ; On vide la liste
  ClearList(Drive())
  
  CoInitialize_(0) 
  
  ; On récupère la liste des lecteurs
  DriveString_Length = GetLogicalDriveStrings_(0, 0) 
  *DriveString = AllocateMemory(DriveString_Length) 
  GetLogicalDriveStrings_(DriveString_Length, *DriveString) 
  
  For DriveIndex = 0 To DriveString_Length - 4 Step 4
    AddElement(Drive())
    
    Drive()\Letter = PeekS(*DriveString + DriveIndex) ; lettre
    
    Drive()\Type = GetDriveType_(@Drive()\Letter) ; type de lecteur
    
    If Drive()\Type = Search_Type Or Search_Type = -1
      
      SHGetFileInfo_(Drive()\Letter, 0, @FileInfo, SizeOf(SHFILEINFO), #SHGFI_DISPLAYNAME) 
      Drive()\Name = PeekS(@FileInfo\szDisplayName)
      
    Else
      DeleteElement(Drive())
    EndIf
  Next
  
  FreeMemory(*DriveString)
  CoUninitialize_() 
  
EndProcedure




;- Debut du test

GetDrive()

ForEach Drive()
  Debug "'" + Drive()\Letter + "'   '" + Str(Drive()\Type) + "'   '" + Drive()\Name + "'"
Next

Re: Récupérer les lecteurs disques

Publié : lun. 20/juin/2011 19:13
par anissa
@Falsam

Plusieurs millions d'enregistrements ?? Intéressant ! Très intéressant ! Merci Falsam pour cette précision.

Concernant les lecteurs logiques, oui, je l'ai vu hier soir le code du soldat inconnu je l'ai testé mais j'avais la même erreur qui s'affichait : (Drive() n'est ni une fonction, ni une procedure etc...) Je ne sais pas pourquoi car la syntaxe est juste mais je ne comprends pas pourquoi j'avais cette erreur. Alors j'ai tout simplement simplifié le programme en supprimant le drive() comme nexlist et je l'ai remplacé par une chaîne tout simplement. Comme ceci :

Code : Tout sélectionner

;Récupérer les drives (c:\ d:\ etc..)   DISQUE DUR SEULEMENT (QUI M'INTERESSE)
Global Dim Drive_Nom.s(10),i,j

Procedure GetAllDrives()
   MaskDrive = GetLogicalDrives_()
   Mask      = 1                  
   lpFileSystemNameBuffer.s = Space(256)
   
   j=0
   For i = 65 To 97                   ; 32 bits à tester (lettres de A à Z)
     If MaskDrive & Mask             ; teste le bit B0 etc jusqu'à B31
        wNom$=Chr(i)+":\"
        wType=GetDriveType_(WNom$)
        If wtype=#DRIVE_FIXED
           j=j+1
           Drive_Nom(J)= wNom$
        EndIf
     EndIf
   Mask << 1
   Next i
EndProcedure

;Récupérer les lecteurs disques existants
GetAllDrives()

; Affiche les drives :
For i=1 To J
   Debug Drive_Nom(i)
next i

Debug "Terminé "
End
Ce qui a donné les résultats voulus. A propos, je profite pour poser une autre question:

Est ce qu'il y a un moyen plus simple qui permet de parcourir tous les répertoires du disque et n'afficher que les fichiers textes par exemple?

J'ai essayé ExamineDirectory() mais je dois parcourir un autre répertoire une fois celui-ci détecté et ainsi de suite, je en connais pas le nbre de répertoires et sous-répertoires alors comment faire pour simplifier cette opération ?

Exemple j'ai les répertoires suivants dans c:
c:\Window, c:\Doc, c:\Doc\Personnel etc... (on ne connait ni le nbre ni la structure)

Merci

Re: Récupérer les lecteurs disques

Publié : mar. 21/juin/2011 10:00
par falsam
anissa a écrit :@Falsam

Plusieurs millions d'enregistrements ?? Intéressant ! Très intéressant ! Merci Falsam pour cette précision.
Wikipedia a écrit :Lorsque la table est vide, l'algorithme attribue la valeur 1 à l'identifiant, qu'il incrémente pour chaque nouvel enregistrement, jusqu'à atteindre la limite d'un entier signé de 64 bits (263 − 1 = 9223372036854775807).

Re: Récupérer les lecteurs disques

Publié : mar. 21/juin/2011 15:36
par graph100
anissa a écrit :Est ce qu'il y a un moyen plus simple qui permet de parcourir tous les répertoires du disque et n'afficher que les fichiers textes par exemple?

J'ai essayé ExamineDirectory() mais je dois parcourir un autre répertoire une fois celui-ci détecté et ainsi de suite, je en connais pas le nbre de répertoires et sous-répertoires alors comment faire pour simplifier cette opération ?

Exemple j'ai les répertoires suivants dans c:
c:\Window, c:\Doc, c:\Doc\Personnel etc... (on ne connait ni le nbre ni la structure)

Merci
j'ai failli être méchant, excuse moi. Je suis certain d'avoir vu plein de topic qui traitent de ce sujet. et LSI a posté il n'y a pas longtemps un petit programme pour calculer la taille des répertoires.

Déjà pour faire ce que tu demandes il faut utiliser la récursivité :
Wiki a écrit :En informatique et en logique, une fonction ou plus généralement un algorithme qui contient un appel à elle-même est dite récursive.
Ensuite, bah tu prend juste l'exemple de l'aide et tu l'adaptes :mrgreen: avec la récursion, ça fonctionne bien.

Re: Récupérer les lecteurs disques

Publié : mar. 21/juin/2011 15:54
par falsam
Et comme je trouve idiot de coder ce qui l'est déjà, je te donne un exemple que tu retravailles comme tu le souhaites.

Cet exemple, qui illustre la récursivité, fait aussi appel à un thread afin d'éventuellement stopper la boucle récursive.

Code : Tout sélectionner

; Parcourir l'arborecence d'un dossier
;
Enumeration
  #MainForm
  #StartStop
  #ListFiles
  #CountFiles
EndEnumeration

Global CountFiles.i, IdThread.i

;By Flype. Modifié pour illustrer ta demande
Procedure.s ParseDirectory(Folder.s, id.l=0, Filter.s="*.*") 
  
  If Right(Folder, 1) <> "\"
    Folder + "\"
  EndIf
  
  If ExamineDirectory(id, Folder, "*.*")
    While NextDirectoryEntry(id) And GetGadgetData(#StartStop)=#True
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
        If GetExtensionPart(DirectoryEntryName(id))=Filter
          AddGadgetItem(#ListFiles,-1, folder +Chr(10)+DirectoryEntryName(id))
          CountFiles+1
          SetGadgetText(#CountFiles, Str(CountFiles))
        EndIf
        
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(Folder + DirectoryEntryName(id), id + 1, Filter)
        EndIf
        
      EndIf
    Wend
    FinishDirectory(id)
  EndIf
EndProcedure 


;Parcours d'un dossier ou d'une unité de stockage
Procedure StartThread(*Value)
  ClearGadgetItems(#ListFiles)
  CountFiles=0
  
  ;Indiquez ici le filtre de selection
  ParseDirectory("C:",0, "doc")
  
  ;Le parcours est terminée
  SetGadgetText(#StartStop, "Start")
  SetGadgetData(#StartStop, #False)
  MessageRequester("Info", "Parcours terminé"+#CRLF$+Str(CountFiles)+" Fichier(s) trouvé(s)")
EndProcedure


;Affichage de la fenetre principale
Procedure MainFormShow()
  OpenWindow(#MainForm,0,0,500,400,"Lecture d'un dossier(Thread)",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
  TextGadget(#PB_Any, 5, 10, 50, 20, "Fichier(s)")
  TextGadget(#CountFiles, 100, 10, 80, 20, "0")
  ListIconGadget(#ListFiles, 5, 30, 390,250, "Dossier", 250, #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#ListFiles, 1, "Fichier",230)
  ButtonGadget(#StartStop, 170, 270, 70, 20, "Start") 
  
  ;On evite en principe le scintillement 
  ;du au resize de la fenetre
  SmartWindowRefresh(#Mainform, #True) 
EndProcedure

MainFormShow()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #StartStop
          If GetGadgetData(#StartStop)=#False
            SetGadgetData(#StartStop, #True) ;Indiquer au bouton que le parcours est actif
            SetGadgetText(#StartStop, "Stop")
            IdThread=CreateThread(@StartThread(), 0)
          Else
            SetGadgetData(#StartStop, #False) ;Indiquer au bouton que le parcours est desactivé
            SetGadgetText(#StartStop, "Start")
            If IsThread(IdThread)
              PauseThread(IdThread)
            EndIf
            
          EndIf
          
      EndSelect
      
    Case #PB_Event_SizeWindow
      WWidth=WindowWidth(#MainForm)
      Wheight=WindowHeight(#MainForm)
      ResizeGadget(#ListFiles, #PB_Ignore, #PB_Ignore , WWidth-10, Wheight-75)
      ResizeGadget(#StartStop, (WWidth/2)-35, Wheight-30 , #PB_Ignore, #PB_Ignore)
      
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
ForEver