Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Sam 2 Juin 2012 - 19:57 | |
| Eh bien, je suis passé à la suite. Mais comme Panoramic ne sait pas (encore ?) lire les propriétés d'un fichier ou d'un répertoire, j'ai fait une mini-dll FileInfo.dll qu'il faut charger dans mon WebDav Site: http://www.mydrive.ch/Identifiant: panoramic@klausgunther Mot de passe: panoramic123 Dossier; DLLs Fichier: FileInfo.dll Il faut mettre cette DLL dans le même répertoire que le programme ci-après: - Code:
-
label labels : gosub labels gosub constantes gosub variables gosub form0 gosub GUI gosub initialisations
end
labels: label constantes, variables label form0, GUI, initialisations label folder, info label iniloop, ini1 return
constantes: dim maxi% : maxi% = 5000 dim indent$ : indent$ = string$(100,"-") dim dll$ : dll$ = "FileInfo.dll" return
variables: dim no%, no1%, no_rep%, no_tree%, depth%, ptr%, f$, f1$, i%, d$ dim cnt%(maxi%), dir$(maxi%) dim no_wait%, n_file%, n_folder%, rep$, a%, dat$, att$, batt$ return
form0: caption 0,"Tree-View" width 0,1200 height 0,800 return
GUI: ' invisible elements no% = no% + 1 : open_dialog no%
' sample application program objects no% = no% + 1 : container no% : no1% = no% : top no%,10 : left no%,10 width no%,950 : height no%,50 : caption no%,"Select folder" no% = no% + 1 : edit no% : parent no%,no1% : no_rep% = no% top no%,20 : left no%,10 : width no%,860 no% = no% + 1 : button no% : parent no%,no1% : top no%,17 : left no%,880 width no%, 50 : caption no%,"Start" : on_click no%,folder
' treeview objects no% = no% + 1 : container no% : no1% = no% : top no%,80 : left no%,10 width no%,900 : height no%,650 : caption no%,"Folder tree" no% = no% + 1 : list no% : parent no%,no1% : no_tree% = no% top no%,20 : left no%,10 : width no%,880 : height no%,600 font_name no%,"Courier"
' function objects no% = no% + 1 : container no% : no1% = no% : top no%,80 : left no%,910 width no%,250 : height no%,650 : caption no%,"Functions"
' message d'attente no% = no% + 1 : form no% : hide no% : no_wait% = no% : inactive no% top no%,300 : left no%,300 : height no%,150 : width no%,300 caption no%,"Traitement en cours..." no% = no% + 1 : alpha no% : parent no%,no_wait% : top no%,40 : left no%,10 caption no%,"Veuillez patienter..." : font_color no%,255,0,0 font_bold no% : font_italic no% : font_size no%,16
return
initialisations: dll_on dll$ batt$ = string$(7," ") return
folder: inactive 0 show no_wait% pause 1 clear no_tree% n_file% = 0 : n_folder% = 0 f$ = text$(no_rep%) if f$="" then f$ = dir_current$ if dir_exists(f$)=0 then f$ = dir_current$ dir_change f$ item_add no_tree%,"Tree "+chr$(34)+f$+chr$(34) rep$ = f$ depth% = 0 f$ = file_find_first$ dir$(0) = f$ cnt%(0) = 0 iniloop: if f$="_" if depth%>0 depth% = depth% - 1 file_find_close dir_change ".." f$ = file_find_first$ if cnt%(depth%)>0 for i%=1 to cnt%(depth%) f$ = file_find_next$ next i% end_if goto iniloop else goto ini1 end_if end_if cnt%(depth%) = cnt%(depth%) + 1 if dir_exists(f$)=1 depth% = depth% + 1 f1$ = "D "+left$(indent$,depth%)+f$ item_add no_tree%,f1$ gosub info n_folder% = n_folder% + 1 cnt%(depth%) = 0 file_find_close dir_change f$+"\" dir$(depth%) = f$+"\" f$ = file_find_first$ else f1$ = " "+left$(indent$,depth%)+f$ item_add no_tree%,f1$ gosub info n_file% = n_file% + 1 f$ = file_find_next$ end_if goto iniloop ini1: file_find_close item_add no_tree%,str$(n_folder%)+" folders and "+str$(n_file%)+" files in tree "+chr$(34)+rep$+chr$(34) hide no_wait% active 0 to_foreground 0 return info: f1$ = rep$ if right$(f1$,1)<>"\" then f1$ = f1$ + "\" if depth%>0 for i%=1 to depth% f1$ = f1$ + dir$(i%) if right$(f1$,1)<>"\" then f1$ = f1$ + "\" next i% end_if f1$ = f1$ + f$ att$ = "" a% = dll_call1("GetFileAttributes",adr(f1$)) if a%=-1 ' item_add no_tree%,f1$ a% = 16 end_if if bin_and(a%,1)>0 then att$ = att$ + "R" if bin_and(a%,2)>0 then att$ = att$ + "H" if bin_and(a%,4)>0 then att$ = att$ + "S" if bin_and(a%,16)>0 then att$ = att$ + "D" if bin_and(a%,32)>0 then att$ = att$ + "A" att$ = att$ + string$(5," ") att$ = left$(att$,5) if (bin_and(a%,128)=0) and (bin_and(a%,16)=0) dat$ = string$(255," ") i% = dll_call2("GetFileDate",adr(f1$),adr(dat$)) item_add no_tree%," "+left$(batt$,depth%)+str$(a%)+"="+att$+"created at "+dat$ else item_add no_tree%," "+left$(batt$,depth%)+str$(a%)+"="+att$ end_if return
Et on a ainsi, pour chaque fichier, sa date et son heure de création ainsi que ses attributs, et les attributs pour chaque répertoire. La DLL contient 2 fonctions extrèmement simples: att% = dll_call1("GetFileAttributes",adr(fichier$))retourne les attributs codés de la manière suivante: if bin_and(a%,1)>0 then ... Read-only if bin_and(att%, 2)>0 then ... Hidden if bin_and(att%, 4)>0 then ... System if bin_and(att%, >0 then ... Volume ID : ' désolé. le smiley s'affiche à la place d'un 8 ! if bin_and(att%, 16)>0 then ... Directory if bin_and(att%, 32)>0 then ... Archive if bin_and(att%, 64)>0 then ... Linkdat$ = string$(255," ") i% = dll_call2("GetFileDate",adr(f1$),adr(dat$))retourne la date et l'heure de création D'ailleurs, pour les amateurs, voici le source de ma DLL: - Code:
-
library FileInfo;
uses SysUtils, Classes, TextToPanoramic in 'TextToPanoramic.pas';
{$R *.res}
function GetFileAttributes(fil: pchar):integer; stdcall; export; var f: string; begin f := pchar(pstring(fil)^); result := FileGetAttr(f); end;
function GetFileDate(fil: pchar; dat: integer):integer; stdcall; export; var d,f: string; begin f := pchar(pstring(fil)^); d := DateTimeToStr(FileDateToDateTime(FileAge(f))); CopyTextToPanoramic(integer(@d), 0, dat); result := 0; end;
Exports GetFileAttributes, GetFileDate;
begin end.
| |
|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Sam 2 Juin 2012 - 22:39 | |
| Salut Klaus. J’ai testé : c’est OK. Petite astuce : pour éviter l’affichage du smiley à la place du 8, il faut laisser un espace avant la parenthèse fermante Exemple : x( ---> affiche le smiley X(8 ) ---> affichage correct | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Sam 2 Juin 2012 - 23:07 | |
| Ouh-là ! je m'absente la journée et Klaus a déjà fait le boulot ! Bon trop tard ce soir, je testerai ça demain !
Merci papydall, astuce à retenir. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Sam 2 Juin 2012 - 23:23 | |
| Merci, Papydall ! Effectivement, à retenir ! | |
|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Dim 3 Juin 2012 - 15:11 | |
| @Klaus, ça marche impeccable, tout y est !
Je trouve un peu dommage les deux lignes par élément, mais là on n'y peut pas grand chose, du fait que les noms de fichiers peuvent avoir une grande longueur (les 8.3 d'autrefois c'était le bon temps, dans un sens, on pouvait calibrer).
Néanmoins, beau boulot, et je répète (Jack, si tu m'écoutes...) que c'est dommage (et anormal ?) d'avoir les fonctions pour modifier tous les attributs de fichiers et rien pour les lire, d'où la nécessité d'encore faire appel à une dll. | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: FILE_FIND: Arborescence des répertoires dans un mémo Dim 3 Juin 2012 - 15:59 | |
| | |
|