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

Windows Discussion :

Cherche code utilisant CreateFileMapping


Sujet :

Windows

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Cherche code utilisant CreateFileMapping
    Je cherche des exemples ou du code pour comprendre l'usage de ce trio de fonctions de l'API:
    CreateFile()
    CreateFileMapping()
    MapViewOfFile()

    J'imagine par exemple un fichier de plusieurs dizaines de gigas à lire par paquets de 1Mb. Il me parait bien plus simple de faire quelque chose comme ceci:
    f=CreateFile()
    ptr=GlobalAlloc(1Mb)
    ReadFile(f,ptr,1Mb)

    Quel est l'avantage du couple CreateFileMapping/MapViewOfFile lorsqu'on ne cherche qu'à lire ou écrire dans un fichier ? (pas de partage mémoire entre process)
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai entendu mentionner comme un avantage le fait de pouvoir manipuler un fichier binaire de longueur assez arbitraire sans prendre autant de mémoire. Par exemple, un fichier de plusieurs centaines de Mo auquel on accèderait bloc par bloc dans un ordre bizarroïde (genre, un téléchargement en P2P).

    En clair, mapper le fichier en mémoire éviterait de faire des fseek() ou SetFilePointer() dans tous les sens, et permettrait de le faire depuis plusieurs threads (il n'y a qu'un seul "file pointer", alors qu'il peut y avoir plusieurs vues).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Pour l'exemple de code, tu en as pas mal sur MSDN.

    L'intérêt direct d'un FileMapping, c'est le côté multitâche : chaque processus / thread peut créer "le sien" sans ruiner les autres, et le contenu du fichier est alors accessible comme un simple tableau depuis le code. Autre avantage, c'est extrêmement bien mis en cache, bien plus efficacement que tu ne pourras le faire avec des I/O classiques, et c'est également bien plus rapide (pas mal de copies en moins, ça compte sur des gros fichiers).

    Deuxième point d'intérêt, c'est la création de mémoire partagée : c'est d'ailleurs ainsi que l'on procède de façon normale sous Windows pour créer une zone de mémoire partagée entre processus.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Sur msdn je n'ai trouvé qu'un seul exemple, le plus simple, celui de mémoire partagée. Mais beaucoup de blabla qui incite à la plus grande prudence tant la gestion d'erreurs semble complexe (map sur fichier compressé dans une partition ntfs par exemple).

    Ce qui m'intéresse c'est un cas pratique, du "vécu", d'un (très) gros fichier qui tirerait parti de ces fonctions. Rien qu'en lecture se serait déjà pas mal.

    En fait je ne comprend pas comment on pourrait accèder à un fichier de 8Gb avec un mapview de 100Mb (et encore, il semble qu'on ne puisse pas choisir la taile du mapview ?) sans s'amuser à refaire des mapview, morceau par morceau, pour parcourir tout le fichier.
    En clair, si on a un mapview qui commence à l'offest X sur un fichier donné, comment faire pour le déplacer à l'offset X+N, puis X+2N, X+3N, etc ?

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par camboui Voir le message
    Sur msdn je n'ai trouvé qu'un seul exemple, le plus simple, celui de mémoire partagée. Mais beaucoup de blabla qui incite à la plus grande prudence tant la gestion d'erreurs semble complexe (map sur fichier compressé dans une partition ntfs par exemple).
    Tu as regardé cette page ?

    Citation Envoyé par camboui Voir le message
    En fait je ne comprend pas comment on pourrait accèder à un fichier de 8Gb avec un mapview de 100Mb (et encore, il semble qu'on ne puisse pas choisir la taile du mapview ?) sans s'amuser à refaire des mapview, morceau par morceau, pour parcourir tout le fichier.
    C'est pourtant ça qui va remplacer ReadFile, en fait. La seule différence, c'est que la granularité (=la taille de la fenêtre) n'est pas 100% libre, il faut faire avec les contraintes du système.

    Citation Envoyé par camboui Voir le message
    En clair, si on a un mapview qui commence à l'offest X sur un fichier donné, comment faire pour le déplacer à l'offset X+N, puis X+2N, X+3N, etc ?
    Via MapViewOfFile, tout simplement. Le UnmapViewOfFile va libérer le mapping courant : cela ne fait RIEN de concret si le fichier est en lecture seule, et cela va commiter les changements si tu es en écriture. Pour le reste, ce sont les paramètres dwFileOffsetHigh, dwFileOffsetLow et dwNumberOfBytesToMap de MapViewOfFile qui indiquent quelle zone du fichier doit être mappée.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. [C#][code] Utilisation des interfaces
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 21
    Dernier message: 17/07/2006, 10h06
  2. cherche code Menu+formulaires
    Par mimile06 dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 12/06/2006, 12h42
  3. Cherche codes sources campuspress.net
    Par rems14 dans le forum C++
    Réponses: 3
    Dernier message: 07/06/2006, 17h22
  4. [VBA-E] Cherche codes équivalents à "Read, Data, Restore (Basic)"
    Par Brunox73 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/05/2006, 13h17
  5. Les différents codes utilisables pour créer un site web ?
    Par mathieu7497 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 09/03/2006, 10h39

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