CONVERTIR UN FICHIER TEXTE UNIX EN FICHIER TEXTE WINDOWS ET VICE ET VERSA

Signaler
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25842-convertir-un-fichier-texte-unix-en-fichier-texte-windows-et-vice-et-versa

Messages postés
207
Date d'inscription
mercredi 5 mars 2003
Statut
Membre
Dernière intervention
29 mars 2013
5
Ta procédure est compliquée et laisse parfois des caractères 10 et 13
qui s'affichent en rectangles sous le bloc-notes il y a beaucoup plus simple :

procedure Unix2Dos(nomfic: string);
var
l:tstringlist;
begin
l:=tstringlist.cretae;
l.LoadFromFile(nomfic);
l.Text:=ansireplacestr(l.Text,#10,#13#10);
l.SaveToFile(nomfic);
l.free;
end;

NB : Il faut ajouter StrUtils à la clause uses.
Messages postés
9
Date d'inscription
jeudi 17 juillet 2003
Statut
Membre
Dernière intervention
1 mars 2012

Merci pour vos remarques très instructives. C'est vrai que les essais que j'ai réalisés ne concernaient que des petits fichiers. D'où aucune optimisation n'avait été faite.

Mais l'objectif était de transférer un grand nombre de sources d'un OS à l'autre. Je suivrai vos conseils pour améliorer mes fonctions.

Je vous remercie à nouveau.
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
Je suggère une méthode un peu plus performante au travers de ces deux routines :

procedure UnixToDos(const FileName: TFileName);
begin
if FileExists(FileName) then
with TStringList.Create do
try
//Les sauts de ligne sont automatiquement convertis
//en CR + LF
LoadFromFile(FileName);
//on réécrit le fichier aussitôt
SaveToFile(FileName);
finally
Free;
end;
end;

procedure DosToUnix(const FileName: TFileName);
var
fs: TFileStream;
ss: TStringStream;
i: integer;
begin
if FileExists(FileName) then
begin
//le flux de fichier est ouvert en Lecture + Ecriture !
fs := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive);
try
ss := TStringStream.Create('');
try
//Copie le flux de fichier dans le flux chaine
ss.CopyFrom(fs, fs.Size);
//Réinitialisation des positions des 2 flux
ss.Seek(0, soFromBeginning);
fs.Seek(0, soFromBeginning);

for i:= 1 to ss.Size do
if ss.DataString[i] <> #13 then
fs.WriteBuffer(ss.DataString[i], 1);

finally
FreeAndNil(ss);
end; {try..finally}

finally
FreeAndNil(fs);
end; {try..finally}

end;
end;

On appréciera la simplification de la conversion UnixToDos...
Faites gaffe aux radars, ça va très vite ~:)

On peut encore améliorer le temps de traitement de la procédure DosToUnix en traitant et en écrivant des blocs de chaines. Malgré tout, les opérations de lecture se font en une seule passe au lieu de lire caractère par caractère dans le fichier.
Si cela intéresse quelqu'un, il n'y a qu'à le demander.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
1 acces disk par octet en lecture et 1 autre en ecriture, beaucoup trop lent. Essaie d'aspirer au moins 32 Ko en 1 passe et ensuite tu traites le buffer memoire que tu retamponneras aussi en 1 seule passe.