Utilisateur anonyme
-
11 avril 2009 à 23:00
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 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).
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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...
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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...
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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.
@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.
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
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
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)
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 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...
@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