Bonjour tout le monde !
Je développe un système de traitement de fichiers texte.
Le principe est le suivant:
- J'ai 1600 fichiers dans une arborescence de répertoire
- Je souhaite ouvrir tous les fichiers, les parcourir à la recherche de balises(zones de commentaires), supprimer ces zones et enregistrer les fichiers dans un répertoire
- Je souhaite ensuite analyser le contenu épuré de ces fichiers.
Mon premier traitement (recherche et suppression des commentaires) fonctionne parfaitement sur un ensemble restreint de fichiers.
Par contre, si je le lance sur l'intégralité de mon arborescence, j'obtiens le message d'erreur suivant:
Je suis sur un portable avec 1 Go de ram avec Delphi 2005 Edition presonnel.Le projet XXXX.exe a déclenché la classe d'exception EOutOfMemory avec le message 'Mémoire insuffisante'
Pour parcourir l'arborescence des fichiers:
Pour traiter un fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 procedure TForm1.SupprimerCommentaireFichiers(AChemin: string); var Info: TSearchRec; FileText: TStringList; begin AChemin := IncludeTrailingPathDelimiter(AChemin); FileText := TStringList.Create; try if FindFirst(AChemin+'*.*',faAnyFile,Info)=0 then begin repeat if ((Info.Attr and faDirectory)=0) then begin {Fichier} if (ExtractFileExt(info.Name) = '.P') or (ExtractFileExt(info.Name) = '.I') then begin FileText.Clear; AfficherEvolution('Chargement du fichier', AChemin + info.Name); FileText.LoadFromFile(AChemin + info.Name); FileText.Text := RetourneTexteSansCommentaires(FileText.Text); FileText.SaveToFile(AChemin + info.Name); end; end else begin {Répertoire} if (info.Name <> '.') and (info.Name <> '..') then SupprimerCommentaireFichiers(AChemin + info.Name); end; Application.ProcessMessages; Sleep(100); until FindNext(Info)<>0; { Libération des ressources de la recherche } FindClose(Info); end; finally FileText.free; end; end;
Le lancement de l'application hors Delphi provoque le même problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 function TForm1.RetourneTexteSansCommentaires(ATexte: string): string; var PosDebCommentaire, PosFinCommentaire: Integer; begin PosDebCommentaire := Pos('/*', ATexte); Result := ''; while (PosDebCommentaire <> 0) do begin PosFinCommentaire := Pos('*/', ATexte); ATexte := Copy(ATexte, 0, PosDebCommentaire - 1) + Copy(ATexte, PosFinCommentaire + 2, length(ATexte) - (PosFinCommentaire - PosDebCommentaire)); PosDebCommentaire := Pos('/*', ATexte); end; Result := ATexte; end;
Avez-vous une idée ? une piste ?
Partager