Lister tous les dossiers et tous les fichiers d'un CD en affichant le chemin complet dans des listbox après avoir vérifier si un CD est présent dans le lecteur et en ayant récupéré son nom (sans utiliser DriveComboBox).
Vous aurez besoin de 1 Button, de 2 ListBox et de 1 ComboBox.
Le code est écrit sous D6 mais ça doit marcher pour les autres versions.
Source / Exemple :
unit UnitList1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox; {Sorted:=True} //qui affichera les dossiers
ListBox2: TListBox; //qui affichera les fichiers
ComboBox1: TComboBox; //qui affiche les lecteurs CD du PC
Button1: TButton;
procedure LecteurCD(Combo:TComboBox); //juste les lecteur CD/CD-ROM/DVD...
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ChercheDossier(Liste:TListBox; route:string);
procedure ChercheFichier(Liste:TListBox; route:string);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
Drive:Char;
Repertoire:boolean;
Chemin, NomCD:String;
Ch:TSearchRec;
Nb:integer;
implementation
{$R *.dfm}
function GetVolumeID(DriveChar:Char):string;
//récupère le nom du CD dans le lecteur. Si cette
//fonction est utilisé dans un autre programme, suspendre
//la gestion des erreurs pendant l'essai (SetErrorMode et Try)
var
NU, VolFlags:DWord;
Buf:array[0..MAX_PATH] of Char;
begin
Buf[0]:=#$00;
If GetVolumeInformation(PChar(DriveChar+':\'),Buf,DWord(Sizeof(Buf)),
nil,NU,VolFlags,nil,0) then
begin
SetString(Result,Buf, StrLen(Buf));
end;
Result:=Result;
end;
procedure TForm1.LecteurCD(Combo:TComboBox);
// affiche dans le Combo que les lecteurs CD présents
begin
Combo.Clear;
For Drive:='A' to 'Z' do //teste toutes les possibilitées
begin
If GetDriveType(PChar(Drive+':/'))=5 then // 5 -> CD-ROM
begin
Combo.Items.Add('['+Drive+':] '+'CD-ROM');
end;
end;
Combo.SelText:=Combo.Items.Strings[0]; //sélectionne le 1er de la liste
end;
procedure TForm1.ChercheDossier(Liste:TListBox; route:string);
// affiche dans "Liste" la liste des dossiers du CD (chemin complet)
begin
Nb:=FindFirst(route+'*.*', faAnyFile,Ch);
if Nb<>0 then
begin
Repertoire:=False;
FindClose(Ch);
Exit;
end;
While Nb=0 do begin
if ((Ch.Attr and faDirectory)<>0) and (Ch.Name<>'.') then
begin
if (Ch.Name<>'..') then
begin
Liste.Items.Add(route+Ch.Name);
Repertoire:=True;
end;
end;
Nb:=FindNext(Ch);
end;
FindClose(Ch);
end;
procedure TForm1.ChercheFichier(Liste:TListBox; route:string);
// affiche dans "Liste" la liste des fichiers du CD (chemin complet)
begin
Nb:=FindFirst(route+'*.*',faAnyFile,Ch);
While Nb=0 do
begin
if (Ch.Attr and faDirectory)=0 then
Liste.Items.Add(route+Ch.Name);
Nb:=FindNext(Ch);
end;
FindClose(Ch);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//initialise les données du combobox qu'avec les lecteurs CD
LecteurCD(ComboBox1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
driveByte:byte;
begin
//vérifie si il y a un CD dans le lecteur
case ComboBox1.Text[2] of // cherche la correspondance
'C': driveByte:=3; // entre la lettre du lecteur
'D': driveByte:=4; // et sa position dans l'alphabet
'E': driveByte:=5;
end;
if (DiskSize(driveByte))=-1 then
begin
Beep;
MessageDlg(ComboBox1.Text[2]+':\ n''est pas accessible.'+#13+#10+
'Le périphérique n''est pas prêt.', mtWarning, [mbOk], 0);
exit;
end;
{puisqu'il y a un CD dans le lecteur, récupère le nom du CD}
NomCD:=GetVolumeID(ComboBox1.Text[2]);
ComboBox1.Text := Copy(ComboBox1.Text,1,4)+' '+NomCD;
// initialise les données
ListBox1.Clear;
ListBox2.Clear;
Chemin:=Copy(ComboBox1.Text,2,2); {juste la "Lettre" et les "2 points"}
i:=-1;
// lister les dossiers et les sous-dossiers du CD
ChercheDossier(ListBox1,Chemin+'\'); {liste la racine du CD}
While Repertoire do
begin
inc(i); {incrémente i de 1}
if (Listbox1.Items.Count > i) then
begin
Chemin:=ListBox1.Items.Strings[i]+'\';
ChercheDossier(ListBox1,Chemin);
end
else
begin
Repertoire:=False;
end;
end;
// lister les fichiers des dossiers du CD
Chemin:=Copy(ComboBox1.Text,2,2);
ChercheFichier(ListBox2, Chemin+'\'); {liste la racine du CD}
for i:=0 to ListBox1.Count-1 do
begin
ChercheFichier(ListBox2,ListBox1.Items.Strings[i]+'\');
end;
// affiche le nombre de fichiers et de dossiers
Form1.Caption:=ComboBox1.Text+' comporte '+
IntToStr(ListBox1.Count)+' dossiers et '+
IntToStr(ListBox2.Count)+' fichiers.';
end;
end.
Conclusion :
Tout est dans le Zip (exe+source)
J'espère avoir assez détaillé le code
Merci pour les bouts de code que j'ai pu trouver sur ce site...;-)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.