Insérer des bytes dans un stream

Résolu
Utilisateur anonyme - 11 avril 2009 à 23:00
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 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

17 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 00:06
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?  
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 00:15
... 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...
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 13:03
'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.
3
Utilisateur anonyme
12 avril 2009 à 13:19
C'est vrai que les mecs de la SNCF sont doués pour faire greve,  mais pour le reste .
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 13:35
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...
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 avril 2009 à 19:54
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="" />
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 20:32
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...
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
13 avril 2009 à 01:13
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 ="" />
3
Utilisateur anonyme
12 avril 2009 à 00:36
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
12 avril 2009 à 11:15
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="" />
0
Utilisateur anonyme
12 avril 2009 à 11:49
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)
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 20:35
... Au fait, as-tu décelé un inconvénient avec cette méthode?
0
Utilisateur anonyme
13 avril 2009 à 00:20
Je l'aime bien celle là . Merci Cirec .

Cari a raison en snippet ca le ferait
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 avril 2009 à 01:58
@ 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... 
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
13 avril 2009 à 02:25
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 ! 
0
Utilisateur anonyme
13 avril 2009 à 12:17
@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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
15 avril 2009 à 23:18
à la demande générale :
http://www.codyx.org/snippet_inserer-bytes-dans-stream_780.aspx

 
@+
Cirec

<hr siz="" />
0
Rejoignez-nous