Soyez le premier à donner votre avis sur cette source.
Snippet vu 17 168 fois - Téléchargée 35 fois
procedure TForm1.ConvertirUnixVersDos(nomfic: string); var f,s:textfile; ch, ch2, chprec:char; cr,lf,cr2,lf2 :boolean; begin // Assignation du fichier en entrée assignfile(f,nomfic); reset(f); // Assignation du fichier temporaire résultat (situé dans le répertoire de l'application Delphi et porte le nom temp.txt assignfile(s,Extractfilepath(application.exename)+'\temp.txt'); rewrite(s); // Initialisation du caractère précédent chprec :=#0; // Tant qu'on est pas à la fin du fichier d'entrée while not(eof(f)) do begin // Lecture du fichier en entrée caractère par caractère et stockage de celui ci dans la variable ch read(f,ch); // si le caractère lu est "saut de ligne" if ch = #13 then begin // on lit le caractère suivant du fichier entrée read(f,ch2); // écriture du caractère ch dans le fichier de sortie write(s,ch); // si le caractère ch2 est différent de "retour chariot" alors on ajute un caractère "retour chariot" dans le fichier de sortie if ch2 <> #10 then write(s,#10); // Ecriture du caractère ch2 dans le fichier de sortie write(s,ch2); // stockage du dernier caractère lu dans chprec chprec := ch2; end else begin // Si le caractère lu est "retour chariot" if ch = #10 then begin // si le caractère précédent était "saut de ligne" on écrit ch if chprec = #13 then write(s,ch) else begin // lecture du caractère suivant read(f,ch2); // si le caractère suivant est "saut de ligne" if ch2 = #13 then begin // il faut inverser l'ordre de ch et de ch2 dans le fichier de sortie write(s,ch2); write(s,ch); end else begin // sinon, on ajout un "saut de ligne" et on écrit les caractères ch et ch2. write(s,#13); write(s,ch); write(s,ch2); end; end; end // cas d'un caractère <> de "retour chariot" et de "saut de ligne", on écrit tout simplement le caractère dans le fichier de sortie. else write(s,ch); chprec := ch; end; end; // fermeture des fichiers closefile(s); closefile(f); // Suppression du fichier en entrée deletefile(nomfic); // Renommage du fichier temporaire en nomfic renamefile(Extractfilepath(application.exename)+'\temp.txt',nomfic); end; // même chose en plus simple : il suffit de supprimer les caractères #13 du fichier en entrée. procedure TForm1.ConvertirDosVersUnix(nomfic: string); var f,s:textfile; ch,ch2:char; begin assignfile(f,nomfic); reset(f); assignfile(s,Extractfilepath(application.exename)+'\temp.txt'); rewrite(s); while not(eof(f)) do begin read(f,ch); if ch = #13 then read(f,ch); write(s,ch); end; closefile(f); closefile(s); deletefile(nomfic); renamefile(Extractfilepath(application.exename)+'\temp.txt',nomfic); end;
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.
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.
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.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.