CONVERTIR UN FICHIER TEXTE UNIX EN FICHIER TEXTE WINDOWS ET VICE ET VERSA
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
1 sept. 2004 à 00:33
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 2013
-
30 mars 2007 à 19:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
sisi231
Messages postés207Date d'inscriptionmercredi 5 mars 2003StatutMembreDernière intervention29 mars 20135 30 mars 2007 à 19:33
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.
gbegreg
Messages postés9Date d'inscriptionjeudi 17 juillet 2003StatutMembreDernière intervention 1 mars 2012 4 sept. 2004 à 11:44
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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 3 sept. 2004 à 16:17
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 sept. 2004 à 00:33
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.
30 mars 2007 à 19:33
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.
4 sept. 2004 à 11:44
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.
3 sept. 2004 à 16:17
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.
1 sept. 2004 à 00:33