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

Utilisateur anonyme - 11 avril 2009 à 23:00 - Dernière réponse : Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention
- 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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 00:06
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?  

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 00:15
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...

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 13:03
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.

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Utilisateur anonyme - 12 avril 2009 à 13:19
3
Merci
C'est vrai que les mecs de la SNCF sont doués pour faire greve,  mais pour le reste .

Merci Utilisateur anonyme 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 13:35
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...

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 12 avril 2009 à 19:54
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="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 20:32
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...

Merci Caribensila 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Caribensila
Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 13 avril 2009 à 01:13
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 ="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Cirec
Utilisateur anonyme - 12 avril 2009 à 00:36
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 12 avril 2009 à 11:15
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
Utilisateur anonyme - 12 avril 2009 à 11:49
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 12 avril 2009 à 20:35
0
Merci
... Au fait, as-tu décelé un inconvénient avec cette méthode?
Commenter la réponse de Caribensila
Utilisateur anonyme - 13 avril 2009 à 00:20
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 13 avril 2009 à 01:58
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 13 avril 2009 à 02:25
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
Utilisateur anonyme - 13 avril 2009 à 12:17
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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 15 avril 2009 à 23:18
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.