[win C++] Scanner un disuqe dur (enfin une partoche)

Scanner un disuqe dur (enfin une partoche) [win C++] - C++ - Programmation

Marsh Posté le 18-04-2002 à 10:27:15    

Bonjour,
 
j'aimerais scanner tout mon disque D:, et savoir si tel ou tel fichier est un dossier ou un fichier :
 

Code :
  1. void scan(char *dos)
  2. {
  3. SetCurrentDirectory(dos);
  4. WIN32_FIND_DATA *cherche = new WIN32_FIND_DATA;
  5. HANDLE ch = FindFirstFile("*.*", cherche);
  6. bool next = true;
  7. while (next)
  8. {
  9. SetFileAttributes(cherche->cFileName, FILE_ATTRIBUTE_NORMAL);
  10. MessageBox(NULL, cherche->cFileName, "youhou", MB_OK);
  11. if (cherche->dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
  12.   {
  13.   MessageBox(NULL, "est un dossier", "youhou", MB_OK);
  14.   scan(cherche->cFileName);
  15.   }
  16. else
  17.   MessageBox(NULL, "n'est pas un dossier", "youhou", MB_OK);
  18. next = FindNextFile(ch, cherche);
  19. }
  20. delete cherche;
  21. FindClose(ch);
  22. }
  23. //------------------------------------------------
  24. ---------------------------
  25. WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  26. {
  27. scan("d:" );
  28. return 0;
  29. }


 
Seulement il m'indique le premier dossier (qui contient des sous-dossiers), puis en suite m"indique ". est un dossier" sans fin.
Comment faire ma fonction récursive correctement ?
 
@++
 
http://www.juju-le-barbare.fr.fm


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 18-04-2002 à 10:27:15   

Reply

Marsh Posté le 18-04-2002 à 11:02:18    

y'a un truc qui me saute aux yeux : tu fais un setCurrentDirectory() au début de ta fonction, pour lister les fichiers d'un répertoire.
 
en cas de nouveau répertoire, tu réentres dans la fonction. dès que tu en sors, tu appelles findNext(), qui va à ton avis chopper les fichiers de quelle directory ?
 
(pour être plus clair, il manque un setCurrentDirectory() après ton scan()).

Reply

Marsh Posté le 18-04-2002 à 11:48:10    

youdontcare a écrit a écrit :

y'a un truc qui me saute aux yeux : tu fais un setCurrentDirectory() au début de ta fonction, pour lister les fichiers d'un répertoire.
 
en cas de nouveau répertoire, tu réentres dans la fonction. dès que tu en sors, tu appelles findNext(), qui va à ton avis chopper les fichiers de quelle directory ?
 
(pour être plus clair, il manque un setCurrentDirectory() après ton scan()).  




 
je suis ta piste, l'ami :hello:
 
@++
 
http://www.juju-le-barbare.fr.fm


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 18-04-2002 à 11:57:41    

salut,
 
que je mette SetCurrentDirectory(cherche->cFileName);
avant ou après le scan(cherche->cFileName);  
j'y arrive pas :(((
 
bouhou !!
je suis nul ;)
 
@++
 
http://www.juju-le-barbare.fr.fm


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 18-04-2002 à 12:01:11    

Exemple d'une fonction récursive avec FindFirst/Next
(en Pascal mais bon ça change pas grand chose à la logique)
 

Code :
  1. procedure Deltree(sDir: string);
  2.   var
  3.     iIndex   : integer;
  4.     SearchRec : TSearchRec;
  5.     sFileName : string;
  6.   begin
  7.     sDir := sDir + '\*.*';
  8.     iIndex := FindFirst(sDir, faAnyFile, SearchRec);
  9.     while iIndex = 0 do
  10.     begin
  11.        sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
  12.        if SearchRec.Attr = faDirectory then
  13.        begin
  14.          if (SearchRec.Name <> '' ) and
  15.               (SearchRec.Name <> '.') and
  16.               (SearchRec.Name <> '..') then
  17.             Deltree(sFileName);
  18.        end else
  19.        begin
  20.          if SearchRec.Attr <> faArchive then
  21.             FileSetAttr(sFileName, faArchive);
  22.          DeleteFile(sFileName);
  23.        end;
  24.        iIndex := FindNext(SearchRec);
  25.     end;
  26.     FindClose(SearchRec);
  27.     RemoveDir(ExtractFileDir(sDir));
  28.   end;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-04-2002 à 11:29:37    

antp a écrit a écrit :

Exemple d'une fonction récursive avec FindFirst/Next
(en Pascal mais bon ça change pas grand chose à la logique)
 

Code :
  1. procedure Deltree(sDir: string);
  2.   var
  3.     iIndex   : integer;
  4.     SearchRec : TSearchRec;
  5.     sFileName : string;
  6.   begin
  7.     sDir := sDir + '\*.*';
  8.     iIndex := FindFirst(sDir, faAnyFile, SearchRec);
  9.     while iIndex = 0 do
  10.     begin
  11.        sFileName := ExtractFileDir(sDir)+'\'+SearchRec.Name;
  12.        if SearchRec.Attr = faDirectory then
  13.        begin
  14.          if (SearchRec.Name <> '' ) and
  15.               (SearchRec.Name <> '.') and
  16.               (SearchRec.Name <> '..') then
  17.             Deltree(sFileName);
  18.        end else
  19.        begin
  20.          if SearchRec.Attr <> faArchive then
  21.             FileSetAttr(sFileName, faArchive);
  22.          DeleteFile(sFileName);
  23.        end;
  24.        iIndex := FindNext(SearchRec);
  25.     end;
  26.     FindClose(SearchRec);
  27.     RemoveDir(ExtractFileDir(sDir));
  28.   end;

 




 
Salut,
 
merci c'est parfait j'ai adapté en C++ et ça marche impec.
Si tu veux le code dis le moi (sauf qu'il delete pas, il remplis un ListBox1)


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 19-04-2002 à 11:34:55    

Ça ira, j'ai déjà utilisé ça en C++, mais ici au boulot je n'avais que la fonction en Pascal sous la main ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-04-2002 à 12:36:46    

antp a écrit a écrit :

Ça ira, j'ai déjà utilisé ça en C++, mais ici au boulot je n'avais que la fonction en Pascal sous la main ;)  




oky.
Tu peux m'envoyer (par mail si tu veux) la traduc en C++, que je compare à la mienne ?
 
merci


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 19-04-2002 à 12:39:43    

:)
Si j'y pense et que je le retrouve, mais y a pas grand chose de spécial.
À priori les fonctions sont les mêmes (enfin ça l'était pour moi vu que j'utilisais C++Builder, si tu passes par l'API Windows ça je sais pas trop :/)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-04-2002 à 17:18:03    

antp a écrit a écrit :

:)
Si j'y pense et que je le retrouve, mais y a pas grand chose de spécial.
À priori les fonctions sont les mêmes (enfin ça l'était pour moi vu que j'utilisais C++Builder, si tu passes par l'API Windows ça je sais pas trop :/)  




salut,
 
je n'ai pas utilisé la VCL, mais les API en effet...
 
merci


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed