Changer les attributs de tous les fichiers d'une partition

nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014 - 22 nov. 2013 à 11:19
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 26 nov. 2013 à 21:48
Bonjour à tous,

Pour changer l'attribut d'un fichier c'est facile avec "FileSetAttr" .
je veux changer les attributs de tous les fichiers qui se trouvent sur une partition quelconque("d" par exemple).

faut-il chercher tous les fichiers ensuite changer leurs attributs?
si c'est oui, la fonction de recherche, j'utilise:

procedure FileSearch(const PathName, FileName : string) ;

var Rec : TSearchRec;
Path : string;
begin
Path := IncludeTrailingPathDelimiter(PathName) ;
if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
try
repeat
ListBox1.Items.Add(Path + Rec.Name) ;
until FindNext(Rec) <> 0;
finally
FindClose(Rec) ;
end;



Mais pour changer les attributs de tous les fichiers d'un seul coup, j'ai pas d'idée!

merci à vous




5 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 nov. 2013 à 15:18
je ne vois pas d'autres solutions..
pourquoi, ça rame ?
0
nabil351974 Messages postés 75 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 11 mars 2014
Modifié par nabil351974 le 22/11/2013 à 16:50
cantador merci pour ta réponse,

Mais comment intégrer ma fonction de recherche à :

pour changer l'attribut d'un seul fichier pas de soucis :

if SetFileAttributes(PChar(d:\Composants.rar'), FILE_ATTRIBUTE_HIDDEN) then

SetFileAttributes(PChar('d:\Composants.rar'), FILE_ATTRIBUTE_NORMAL);




mais pour tous les fichiers d'une partition, ça rame!!

parce que je n'ai pas réussi à coder ou fonction qui me permet de rechercher les fichiers et changer les attributs de tous les fichiers d'un seul coup!!

merci pour une éventuelle aide.




NABIL
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
26 nov. 2013 à 20:41
Bonsoir,
assaye çà:
// balaye un reprtoires ou un disque, recherche les fichiers correspondant aux critères
// et change les attributs des fichiers
// ex d'appel: ChangeFilesAttr ( 'c:\', '*.xyz', NewAttr, true);
procedure ChangeFilesAttr (root, critere : string; SubDir : boolean; Attr:integer );
var Rec : TSearchRec;
FullName : string;
begin
if root[ length(root) ]<>'\'
then root:=root + '\';
if (FindFirst (root+critere , faAnyFile, Rec)=0) then
repeat
fullname := root + rec.Name;
if (rec.name[1] <> '.') then // éviter les fichiers '.' (RootPath)
begin
// c'est un folder, si SubDir on le balaye aussi
if (rec.Attr = faDirectory) and SubDir then
ChangeFilesAttr (FullName +'\', critere, SubDir, Attr);
// et là on change l'attribut du fichier/folder ... mais moi je ne le fais pas
// FileSetAttr(FullName, Attr);
end;
until FindNext(Rec) <> 0;
end;
Ca va aller ?
solilog
0
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
26 nov. 2013 à 21:48
Re salut
mes excuses, la 1ere proc n'était pas terrible, elle cherchait les sous-folders avec les critères, mais là ca merche
dans tous les cas et retourne le nb de fichiers modifiés.
Tu essayes avec edit1 (root), edit2 (critere) un memo memo1 et un bouton

// balaye un reprtoires/disque, recherche les fichiers correspondant aux critères
// et change les attributs des fichiers
// ex d'appel: ChangeFilesAttr ( 'c:\', '*.xyz', NewAttr, true);
// retourne le nb de fichiers modifiés
function ChangeFilesAttr (root, critere: string; SubDir: boolean; Attr: integer ): integer;
var Rec : TSearchRec;
FullName : string;
begin
result := 0;
root := trim(root); // au cas ou
if root[ length(root) ]<>'\'
then root := root + '\'; // le dernier char doit etre un backslash
// on balaye les FICHIERS fichiers de root
if (FindFirst (root+critere , faAnyFile - faDirectory, Rec)=0)
then repeat
fullname := root + rec.Name;
if (rec.name[1] <> '.') // éviter les fichiers '.' ou '..' (RootPath)
then begin
// je mettrais un try si fichier occupé, ou pas les droits, ...
try
// FileSetAttr(FullName, Attr); // On change l'attribut
inc( result );
except
end;
end;
until FindNext(Rec) <> 0;

// si subdir, on balaye SOUS-FOLDERS de root
if SubDir and (FindFirst (root + '*.*', faDirectory, Rec)=0) then
repeat
fullname := root + rec.Name;
if (rec.name[1] <> '.') then // éviter les fichiers '.' ou '..' (RootPath)
result := result + ChangeFilesAttr (FullName+'\', critere, SubDir, Attr);
until FindNext(Rec) <> 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var t:tdatetime;
nbr: integer;
begin
screen.cursor:=crHourglass;
t:=now;
application.processmessages;
nbr := ChangeFilesAttr (edit1.text, edit2.text, true, 0 );
t:=now-t;
memo1.lines.add ( edit1.text+edit2.text+' ' +
inttostr( nbr) + ' fichiers répondant aux critères en ' +
formatdatetime('hh:nn:ss zzz' , t) +#13#10);
screen.cursor:=crDefault;
end;




evec Edit1.text = 'C:\windows\' et edit2.text='*.*, memo1 me retourne "c:\windows\*.* 82868 fichiers répondant aux critères en 00:00:06 880"
Bon courage
solilog
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 nov. 2013 à 10:13
mais pour tous les fichiers d'une partition, ça rame!!

si tu changes les attributs d'un grand nombre de fichiers,
c'est normal..

une piste:
l'écrire dans un autre langage plus rapide
-1
Rejoignez-nous