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

C++ Discussion :

Récupérer la taille d'un cluster


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Récupérer la taille d'un cluster
    Bonjour,

    Je cherche une solution (portable de préférence) pour récupérer la taille (en octets) d'un cluster de mon disque dur.

    J'avais pensé à :
    - lire le nombre N1 d'octets libres sur le disque (je ne sais comment faire en portable)
    - ensuite créer NF fichiers de 1 octets
    - lire le nombre N2 d'octets libres sur le disque
    - calculer la taille d'un cluster C = ( N2 - N1 ) / NF

    Vous avez déjà écrit une fonction portable de ce style ?

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Kaji Voir le message
    Bonjour,

    Je cherche une solution (portable de préférence) pour récupérer la taille (en octets) d'un cluster de mon disque dur.

    J'avais pensé à :
    - lire le nombre N1 d'octets libres sur le disque (je ne sais comment faire en portable)
    - ensuite créer NF fichiers de 1 octets
    - lire le nombre N2 d'octets libres sur le disque
    - calculer la taille d'un cluster C = ( N2 - N1 ) / NF

    Vous avez déjà écrit une fonction portable de ce style ?
    Portable ? non - parce que c'est impossible. La taille du cluster dépends du système de fichier, et le système de fichier dépends en grande partie du système d'exploitation.

    Ton algorithme est un exemple frappant : que se passe-t-il si l'os décide de mettre tous les fichiers de 1 octet que tu a créé dans le même cluster ?

    Ce qu'il te faut réellement, c'est une fonction bien plus ardue à réaliser : ouvrir le device physique, vérifier le type du système de fichier, et en fonction de la documentation de ce type de FS, trouver la taille d'un cluster. Autrement dit : bon courage
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    Salut,
    Citation Envoyé par Emmanuel Deloget Voir le message
    Ton algorithme est un exemple frappant : que se passe-t-il si l'os décide de mettre tous les fichiers de 1 octet que tu a créé dans le même cluster ?
    Cela ne peut normalement pas arriver: un cluster représente une adresse unique, normalement insécable, au même titre que les blocs de 512 octets d'un disque dur.

    Tout comme deux fichiers de 1 octets utiliseront en tout au minimum deux blocs de 512 octets, parce qu'il serait impossible de fournir un moyen pour dire que "la première partie du bloc sert pour le fichier 1 et la deuxième pour le fichier 2", un cluster ne peut théoriquement - ou du moins pour ce que j'en sais - ne contenir qu'un seul fichier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Cela ne peut normalement pas arriver: un cluster représente une adresse unique, normalement insécable, au même titre que les blocs de 512 octets d'un disque dur.

    Tout comme deux fichiers de 1 octets utiliseront en tout au minimum deux blocs de 512 octets, parce qu'il serait impossible de fournir un moyen pour dire que "la première partie du bloc sert pour le fichier 1 et la deuxième pour le fichier 2", un cluster ne peut théoriquement - ou du moins pour ce que j'en sais - ne contenir qu'un seul fichier
    En théorie, un cluster est géré par un driver de file system. Si le driver implémente un système de chainage inter-cluster, alors tu peux mettre plusieurs fichiers dans un même cluster. NTFS n'a pas l'aire de le faire, mais je crois me souvenir que cette technique était utilisée sur un OS connu (bien que ma mémoire, défaillante, ne me permette pas de me souvenir lequel).

    Cependant, un système analogue est supporté sous NTFS, via les flux internes de fichiers (un fichier peut se voir attribuer plusieurs flux). N flux peuvent coexister dans un fichier - ce qui permet d'encoder des méta-données, en plus du système de gestion des méta-données propres à NTFS. Détourner ce système pour créer plusieurs "fichiers" (en fait, plusieurs flux) dans un même cluster est trivial (un nom de fichier avec un flux est noté sous la forme: nonfichier.ext:nomflux). En fait, un driver NTFS ne sait pas lire des fichiers : il ne sait lire que des flux, et les données d'un fichier sont simplement contenue dans un flux non nommé.

    Ceci dit, étant donné que je suis dans une phase de recherche, je viens de redécouvrir quelque chose que j'avais oublié : dans certaines conditions (et notamment si le fichier est petit) le fichier et ses données peuvent être stocké directement dans la master file table de la partition NTFS. Dans ce cas, la taille sur disque sera exactement égale à la taille du fichier.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour ces réponses.

    Il me semblait également qu'on ne pouvait écrire qu'un fichier par cluster et que suivant le type de formatage (FAT32 ou NTFS) et la taille du disque, la taille des clusters variait.

    Ce qui me manque, pour faire un essai, c'est connaître le nombre d'octets libres sur le disque. Ca existe en C/C++ ?
    Je viens de parcourir "Le langage C" / Kernighan, je n'ai pas trouvé.
    Il y a peut-être une librairie portable qui donne cette information ?
    Ne me dites pas que je vais devoir ajouter un #include<Windows.h> & co ?!

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ce n'est pas du tout portable mais tu as GetDiskFreeSpace() sous Windows pour connaitre la taille des cluster

    http://msdn2.microsoft.com/en-us/lib...35(VS.85).aspx
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Invité
    Invité(e)
    Par défaut OK
    Citation Envoyé par ram_0000 Voir le message
    Ce n'est pas du tout portable mais tu as GetDiskFreeSpace() sous Windows pour connaitre la taille des cluster
    Effectivement, cette fonction donne :
    - le nombre d'octets par secteur (N1)
    - le nombre de secteurs par cluster (N2)

    Et donc, la taille d'un cluster c'est N1 x N2.

    Ca donne 4096 (4Ko) sur mon disque NTFS.

    Merci !

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

Discussions similaires

  1. Récupérer la taille d'un fichier
    Par vodevil dans le forum Langage
    Réponses: 12
    Dernier message: 19/07/2005, 17h53
  2. Récupérer la taille d'une image dans un fichier (GIF/JPEG)
    Par SheikYerbouti dans le forum Multimédia
    Réponses: 4
    Dernier message: 12/05/2005, 14h17
  3. [J2ME][debutant] Récupérer la taille d'un écran
    Par kisscool31 dans le forum Java ME
    Réponses: 4
    Dernier message: 21/04/2005, 16h56
  4. Réponses: 2
    Dernier message: 13/08/2004, 16h50
  5. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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