Lire et écrire un fichier

Résolu
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 - Modifié par MiniApp le 17/02/2015 à 10:29
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 - 17 févr. 2015 à 17:41
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

cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
Modifié par cs_yanb le 17/02/2015 à 13:49
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;

@+
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
Modifié par MiniApp le 17/02/2015 à 14:19
Désolée ça ne marche pas :'-(. Le fichier est crée et lu mais est faux.
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14 > MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019
17 févr. 2015 à 14:59
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;
...
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
Modifié par MiniApp le 17/02/2015 à 15:03
Oups. Je n'avait pas actualisé. Je teste ta méthode.
0
MiniApp Messages postés 654 Date d'inscription lundi 21 juillet 2014 Statut Membre Dernière intervention 22 février 2019 5
17 févr. 2015 à 17:41
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.
0
Rejoignez-nous