Insérer des bytes dans un stream [Résolu]

- - Dernière réponse : Cirec
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
- 15 avril 2009 à 23:18
Salut à tous,

Depuis quelque temps je cherche à insérer des donner des données dans un TFilStream.

 Il est possible de le faire en utilisant un Stream temporaire et la fonction CopyFrom . Mais cette méthode me convient pas trop   (Je la trouve un peu bourrin). Je me demandais si vous n'aviez pas une idée alternative à me proposer et qui soit performante.

En fait je me dis que s'il était possible de décaler des bits vers la droite (une sorte de SHR) ca serait pas une bonne solution : Mais je n'ai rien trouvé permettant une telle opération sur un stream (Ce qui est bien dommage).

Je vous remercie par avance
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
Salut Francky,

Si j'ai bien compris, je ne pense pas que ce que tu veux faire soit possible sur 1 seul fichier.
Par contre, tu pourrais peut-être couper ton fichier principal en autant de petits fichiers secondaires et effectuer une gestion de ces fichiers en les rassemblant dans un TMemoryStream quand tu en as besoin. Ainsi, lorsque tu veux insérer et sauvegarder de nouvelles données, il te suffira de rajouter un TFileStream parmi ceux déjà existants et mettre à jour le code de gestion de ces fichiers. L'avantage est que la sauvegarde de données sera très rapide, mais le rapatriement sans doute plus lent...

Tu me suis ou je suis 100% à l'ouest?  

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
... Une autre solution serait de laisser de la place vacante (remplie de zéro, par exemple) dans ton FileStream et de ne l'agrandir que de temps en temps, quand le besoin s'en fait sentir. Mais 'faut voir si tes données à sauvegarder sont toujours plus ou moins du même format...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
'faut avouer que les flux de données c'est pas fait pour être manipulé à tous bouts de champs.
Un flux c'est un flux. C'est pas une commode à tiroirs.

C'est d'ailleurs le même bordel à la SNCF quand ils veulent ajouter un wagon au milieu d'un convoi.
En général ils l'attachent à la queue... et roule ma poule, si on peut dire.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
3
Merci
C'est vrai que les mecs de la SNCF sont doués pour faire greve,  mais pour le reste .

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
C'est pas la peine d'essayer de faire grève avec Delphi.
J'ai déjà essayé de négocier certains trucs, perso, mais ça n'a jamais vraiment abouti...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
3
Merci
regarde ça :

Tu crées un fichier nommé "TestFrancky.dat" tu y colles un texte par exemple:
"Francky
tu vois ça fonctionne ^^"
et tu executes ce code

procedure TFrm_Main.Button3Click(Sender: TObject);
var MS: TMemoryStream;
    strAjout: string;
    aLen: Integer;
begin
  strAjout := 'Salut ';
  aLen := Length(strAjout);
  MS := TMemoryStream.Create;
  with MS do
  try
    LoadFromFile('TestFrancky.dat');
    Size := Size + aLen;
    Move(Memory^, Pointer(Integer(Memory)+aLen)^, Size-aLen);
    Move(Pointer(strAjout)^, Memory^,  aLen);
  finally
    SaveToFile('TestFrancky.dat');
    Free;
  end;
end;

voilà plus d'excuses

 
@+
Cirec

<hr siz="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
3
Merci
Waoooo !
Génial !
C'est les cheminots du Delphi qui vont être contents ! 

Mais 'faut que tu fasses un snippet, Cirec !
Ici, cette perle va se perdre...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
3
Merci
de rien
mais juste une petite correction tout de même

afin de garantir une allocation mémoire propre il est préférable d'utiliser "SetSize" à la place de "Size := Size + 1"

Procedure TFrm_Main.Button3Click(Sender:
TObject);
Var strAjout: String;
    aLen: Integer;
Begin
  strAjout : = 'Salut
';
  aLen := Length(strAjout);
  With
TMemoryStream.Create Do
  Try

    LoadFromFile('TestFrancky.dat');

     SetSize(Size + aLen);
    Move(Memory^,
Pointer(Integer(Memory)+aLen)^, Size-aLen);
    Move(Pointer(strAjout)^,
Memory^, aLen);
    SaveToFile('TestFrancky.dat');
  Finally

    Free;
  End;
End;

@Caribensila:
sinon ... non rien en particulier mais j'ai pas réellement éprouvé cette technique ...
et puis c'est qu'un simple décalage d'octets* .. ça ne devrait donc pas poser de problèmes autres que ceux que l'on connait déjà ... je pense aux fichiers de grandes tailles  par ex. ou allocation de mémoire impossible par manque de place ... etc. etc.

*: ça vaut vraiment un snippet ça ?

 
@+
Cirec

<hr siz ="" />

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Cirec
0
Merci
Ben en fait c'est pour ajouter des données à un fichier wav : je ne peux malheureusement pas découper mon fichier en petits fichiers.

C'est quand meme relou qu'il n'existe pas un moyen de déplacer des données dans un stream, sans utiliser de tel artifice (artifices qui peuvent prendre du temps).

Par contre on doit pouvoir utiliser un tampon de donnée et faire un décalage de la la fin vers le début  du stream(si tu me suis), par un simple write, jusqu'à la zone d'insertion. Puis il suffit de rajouter les données que l'on veut insérer (Je ne sais pas si je suis clair)

Merci pour ta réponse (que je valide car elle répond partiellement à la problématique ). Merci Cari
Commenter la réponse de Utilisateur anonyme
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
0
Merci
Salut,

il n'y a rien de bourrin dans l'utilisation de CopyFrom ... au contraire ... c'est une méthode native de la classe TStream qui est prévue pour celà ... je vois pas ou est le problème

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec
0
Merci
Salut Cirec. Pour le bourrin : Je trouve lourd le fait de devoir recréer un second stream pour faire cela, sans parler du fait que ca peut etre très long (suivant la taille de ton fichier)
Commenter la réponse de Utilisateur anonyme
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
0
Merci
... Au fait, as-tu décelé un inconvénient avec cette méthode?
Commenter la réponse de Caribensila
0
Merci
Je l'aime bien celle là . Merci Cirec .

Cari a raison en snippet ca le ferait
Commenter la réponse de Utilisateur anonyme
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
0
Merci
@ Cirec
Bein, j'ai pas de conseil à te donner.
Mais, perso, j'avais jamais vu ça et c'est pas parce que c'est simple (relativement) que c'est pas bien. Je dirais même que c'est mieux quand c'est simple.  
D'ailleurs, pour les très grands fichiers dont tu parles, ça peut certainement accélérer le traitement par rapport à l'utilisation de CopyFrom (à calculer dans quelle mesure).

Et puis, soit dit entre snippetiseurs, si tu ne snippetisais pas ça j'oserais plus rien snippetiser du tout... 
Commenter la réponse de Caribensila
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
12
0
Merci
Avant, pour Francky, les Streams c'étaient un peu des hermaphrodites, comme les escargots.





'fallait insérer les bytes à la queue.



Maintenant, il pourras leur démonter la passerelle, la cale, la dunette arrière.

Ca va bouleverser les habitudes de Francky ! 
Commenter la réponse de Caribensila
0
Merci
@Cirec  : Pour les gros fichiers, ce qui serait intéressant de trouver une méthode similaire avec un TFileStream.

@Cari : Faudrait peut etre demandé à Borland de rajouter ce type de fonction lors d'une nouvelle version de Delphi. Du reste il serait bien que Borland ouvre un blog (ou un site) afin que leurs utilisateurs puissent faire part de leur envies en terme de fonction.

Pour l'escargot : Tant qu'on fait pas dans le mollusque, il y a pas de quoi s'inquieter
Commenter la réponse de Utilisateur anonyme
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
39
0
Merci
à la demande générale :
http://www.codyx.org/snippet_inserer-bytes-dans-stream_780.aspx

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec

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.