IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Comment copier un fichier dans un TFileStream et inversement ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut Comment copier un fichier dans un TFileStream et inversement ?
    Dans mon projet, je désire transférer un ensemble de fichier différents dans un seul fichier pour rendre celui-ci exploitable sur n'importe quel machine sans devoir aller chercher un wav là-bas, une vidéo ici, une musique là!

    Lors de la lecture de ce fichier, il doit replacer ceux-ci dans un répertoire temporaire pendant l'exécution du projet:

    exemple :

    vidéo dans d:\simulateur\vidéo\coucou.wmv
    musique dans g:\musique\elco\track12.wav
    effet sonore dans c:\effets\explode.wav
    image dans [CD-ROM]:\armes\cible.jpg
    ....

    devient:

    mon_projet.cts

    lors de l'ouverture de celui-ci, le programme crèe un repertoire temporaire qui va contenir:
    coucou.wmv
    track12.wav
    explode.wav
    cible.jpg
    ....

    J'essaie d'utiliser les TFileStream, ca va bien pour écrire les fichiers les uns à la suite des autres avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ficdest.SaveToStream(ficorg)

    Mais comment les relire, dès que j'utilise un LoadFromStream, il charge tout d'un seul coup, ce qui est son fonctionnement par défaut!

    Existe-t-il une fonction de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    FileToFileStream(OrigFile:string; DestStream:TFileStream);
    begin
       // écrire le nom du fichier dans le stream
      // écrire la taille du fichier dans le stream
      // écrire le fichier dans le stream
    end;
     
     
    FileStreamToFile(OrigStream);
    begin
       // récupérer le nom du fichier dans le stream
      // récupérer la taille du fichier dans le stream
      // extraire le fichier pour le copier sur le disque
    end;
    Les étapes taille et nom ne me pose pas de problème, dois-je utiliser un TMemoryStream ou un tampon?

    Merci pour les pistes car comment récupère-t-on la taille du fichier charger dans un TMemoryStream?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Seek(0,soFromEnd);
    Comment dire à un TMemoryStream qu'il ne doit charger qu'une partie d'un autre Stream et pas l'entièreté?

    Je reviens voir demain car le boulot est fini! Merci

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 874
    Points : 11 363
    Points
    11 363
    Billets dans le blog
    6
    Par défaut
    le plus simple est sûrement de créer un header qui contiendra par exemple un byte pour le nombre de fichiers compilés, puis un record pour chaque fichier avec son nom (string[50] pe) et sa taille.
    une fois que tu as lu le nombre de fichiers, tu lis chaque info fichier, puis chaque fichier

    pour lire une partie d'un autre stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function CopyFrom(Source: TStream; Count: Longint): Longint;

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    1e solution :
    - Tu ouvre un TMemoryStream (ou TFileStream c pareil )
    - Tu ouvre le premier fichier dans un 2e TMemoryStream
    - Tu copie dans le 1e Stream un entier correspondant a la taille du 2e Stream, puis tu fait une copie du 2e Stream dans le Premier.
    - Tu repete l'opperation pour tous tes fichier
    - Tu fini par un SaveToFile (si tu passe par le TMemoryStream)

    la trame de ton stream sera donc :
    [SIZE] [STREAM] [SIZE] [STREAM] ...

    Pour la lecture tu fait l'inverse :
    - Tu cree tes 2 Stream, l'un contenant le Gros Stream, l'autre le futur fichier extrait.
    - Tu lit dans le 1e 1 octet (tailel du stream qui suit)
    - Tu copie les NOctets lut suivant du 1e Stream vers le 2e.
    - Tu enregistre ton fichier par un SaveToFile
    - Tu repete l'operation jusqu'a la fin du 1e stream.

    Tu peut aussi rajouter en entete le nombre de fichier pour fgaciliter l'arret et eventuelement les chemins relatifs de ton arborescence pour reconstruire l'arborescence de depart

    [NBFiles] [PathLength] [PAth] [SizeStream] [Stream] [PathLength] [PAth] [SizeStream] [Stream] [PathLength] [PAth] [SizeStream] [Stream] ....

    Autre methode (encore a l'etude de mon cote sur les possibilités ) :
    - Tu genere un fichier .Res contenant en tant que RCDATA tous tes ficheirs
    - Tu cree une Dll vide avec juste la ligne {$R MonArchive.Res}
    - Tu compile

    LA dll obtenu aura le meme effet que ton gros fichier.
    Pour extraire les fichiers il te suffira de charger la Dll (LoadLibrary) puis d'extraire les fichiers dans un TRessourceStream (LoadFromStream(Dllhandle, Ressourcename)) puis de les copier sur le Hdd (SaveToFile).

    Note : La dll pourra etre renomee au niveau de l'extention pour "masquer" visuellement l'aspect "Dll" de ton archive. cela ne change en rien le code de manipulation.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Moi pas vu cet fonction, moi frapper sur doigts pour apprendre à appuyer sur F1!!!

    Merci, mon problème est résolu.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Pour clorish, je viens juste de voir ta réponse car, la première réponse était restée en écran de fond pendant une heure!

    Ma méthode une structure qui contient les noms de fichiers contenus au sein de tableaux dynamiques contenant des records... suivi des fichiers avec taille/données!

    La méthode copyfrom marche impeccable! La seconde méthode à l'air bien mais je n'ai pas encore atteind ce niveau! Peut être quand je vais réécrire le programme! La béta de démo doit tourner pour lundi!

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment copier un fichier dans un dossier de mon choix
    Par sebac dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 20/05/2010, 12h25
  2. Comment copier un fichier dans le dossier temporaire ?
    Par zaydoun_391 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 28/12/2007, 05h42
  3. Réponses: 1
    Dernier message: 16/02/2006, 08h50
  4. [Système] Comment copier un fichier dans le presse papier ?
    Par le y@m's dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/09/2005, 12h03
  5. Comment Copier une table dans un fichier?
    Par thx2003 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2003, 12h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo