Lire et écrire un fichier [Résolu]

Signaler
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
-
Bonjour

Je demande de l'aide car je n'arrive pas à lire ou écrire dans un fichier via un TBytes. J'ai utilisé des file, des handle et les TFileStream. A chaque fois j'ai un bug. Dans l'utilisation des files j'ai des bugs à l'écriture des fichiers qui marche 1 fois sur 2 (Erreur d'E/S 1784 sur BlockWrite), je croit que c'est les files qui ont le mieux marcher. Les TFileStream lisent (et je croit enregistre) des donnés fausses.

Merci beaucoup si vous résolvez mon problème. Pour compléter les infos :
-> En lecture j'utilise les droits de lecture et partage le fichier en lecture seule.
-> En écriture j'utilise les droits d'écriture et ne partage pas le fichier.
-> Avec l'utilisation des files j'ouvre avec Rewrite quand j'écrit.

Les derniers testent en lecture :
procedure TCustomExtenssibleDynamicPicture.LoadFromFile(FileName:String;ShareMode:Byte=fmShareDenyWrite);
{Charge depuis un fichier
ShareMode indique la méthode de partage du fichier (par défault et conseiller fmShareDenyWrite)}
Var
Txt:TBytes;
FileStream:TFileStream;
begin
  if not FileExists(FileName) then
    begin
      raise ELoadExtenssibleDynamicPicture.Create('L''image EDP n''existe pas');
      exit;
    end;
  if Assigned(FOnLoadProgress) then//événement
    FOnLoadProgress(Self,EDPLSSOpenFile,0,0);
  FileStream := TFileStream.Create(FileName,fmOpenRead+ShareMode);
  SetLength(Txt,FileStream.Size);
  FileStream.ReadBuffer(Txt,FileStream.Size);
  FileStream.Free;
  LoadFromByteArr(Txt);//Traite le fichier
if Assigned(FOnLoadProgress) then//événement
  FOnLoadProgress(Self,EDPLSSFinish,0,0);
end;


En écriture :
procedure TCustomExtenssibleDynamicPicture.SaveToFile(FileName:String;ShareMode:Byte=fmShareExclusive);
{Cette méthode permet d'enregistrez l'image dans le fichier spécifié
Le résultat indique si l'opération à réussi

ShareMode indique la méthode de partage du fichier (par défault et conseiller fmShareExclusive)}
Var
RAW:TBytes;
FileStream:TFileStream;
begin
  if Assigned(FOnLoadProgress) then//événement
    FOnLoadProgress(Self,EDPLSSOpenFile,0,0);
  FileClose(FileCreate(FileName));
  FileStream := TFileStream.Create(FileName,fmOpenWrite+ShareMode);
  RAW := SaveToByteArr;//Renvoie un TBytes
  FileStream.Size := Length(RAW);
  FileStream.WriteBuffer(RAW,FileStream.Size);
  FileStream.Free;
if Assigned(FOnLoadProgress) then//événement
  FOnLoadProgress(Self,EDPLSSFinish,0,0);
end;


Merci.

Chercher et essayer : vous trouverez la solution!
Fouiner et regarder partout : vous trouverez la connaissance!!

2 réponses

Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13
Salut,
A la mano pas tester...
  procedure TCustomExtenssibleDynamicPicture.SaveToFile(FileName:String;ShareMode:Byte=fmShareExclusive);
{Cette méthode permet d'enregistrez l'image dans le fichier spécifié
Le résultat indique si l'opération à réussi ShareMode indique la méthode de partage du fichier (par défault et conseiller fmShareExclusive)}
var
RAW:TBytes;
FileStream:TFileStream;
begin
if Assigned(FOnLoadProgress) then//événement
FOnLoadProgress(Self,EDPLSSOpenFile,0,0);
FileClose(FileCreate(FileName));
FileStream := TFileStream.Create(FileName, fmCreate);
try
RAW := SaveToByteArr;//Renvoie un TBytes
if RAW <> nil then
FileStream.WriteBuffer(RAW[0], Length(RAW));
finally
FileStream.Free;
end;
if Assigned(FOnLoadProgress) then//événement
FOnLoadProgress(Self,EDPLSSFinish,0,0);
end;

@+
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
Désolée ça ne marche pas :'-(. Le fichier est crée et lu mais est faux.
Messages postés
263
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
28 avril 2021
13 >
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019

Oui faux c'est à dire ? es-tu sur de ton 'SaveToByteArr' ?
Peut-être faut-il ajouter...blabla....exemple :
...
if FileExists(FileName) then
begin
FileStream := TFileStream.Create(FileName,fmOpenWrite or fmShareMode);
FileStream.Seek(0,soFromEnd);
end
else
begin
FileStream := TFileStream.Create(FileName,fmCreate);
try
...
FileStream.Write(RAW[0],Length(RAW));
finally
FileStream.Free;
end;
end;
...
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
Oups. Je n'avait pas actualisé. Je teste ta méthode.
Messages postés
653
Date d'inscription
lundi 21 juillet 2014
Statut
Membre
Dernière intervention
22 février 2019
5
ALLELUIA !!! Merci beaucoup cs_yanb. J'ai utiliser ton code et il marche ! Je l'ai également légèrement modifier pour être utiliser dans mon code de lecture et il MARCHE !!! Pour le SaveToByteArr il y avait un petit bug mais un autres problème était présent. Désormais je sais lire et écrire un fichier via un TBytes. Je te dit vraiment merci cs_yanb.