Lire et écrire un fichier

Résolu
MiniApp
Messages postés
653
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
653
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
267
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
20 mai 2022
13
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
653
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
267
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
20 mai 2022
13 > MiniApp
Messages postés
653
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
653
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
653
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