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
Récupérer les lecteurs disques
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Récupérer les lecteurs disques
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'
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'
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Récupérer les lecteurs disques
Le Soldat Inconnu a effectivement posté quelques lignes de codes sur ce sujet.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...)
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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Récupérer les lecteurs disques
@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 :
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
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
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
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Récupérer les lecteurs disques
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).
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Récupérer les lecteurs disques
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.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
Déjà pour faire ce que tu demandes il faut utiliser la récursivité :
Ensuite, bah tu prend juste l'exemple de l'aide et tu l'adaptesWiki 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.

_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel
)
Mon site : CeriseCode (Attention Chantier perpétuel

- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Récupérer les lecteurs disques
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.
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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%