Lire et écrire un fichier [Résolu]

MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention - 17 févr. 2015 à 10:28 - Dernière réponse : MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention
- 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!!
Afficher la suite 

Votre réponse

5 réponses

cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention - Modifié par cs_yanb le 17/02/2015 à 13:49
0
Merci
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;

@+
MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention - 17 févr. 2015 à 14:11
Désolée ça ne marche pas :'-(. Le fichier est crée et lu mais est faux.
cs_yanb 260 Messages postés lundi 27 octobre 2003Date d'inscription 4 mars 2016 Dernière intervention > MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention - 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;
...
MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention - 17 févr. 2015 à 15:02
Oups. Je n'avait pas actualisé. Je teste ta méthode.
Commenter la réponse de cs_yanb
MiniApp 638 Messages postés lundi 21 juillet 2014Date d'inscription 16 août 2018 Dernière intervention - 17 févr. 2015 à 17:41
0
Merci
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.
Commenter la réponse de MiniApp

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.