Taille fichier

cs_sekka Messages postés 26 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 24 janvier 2009 - 24 janv. 2009 à 18:03
 Utilisateur anonyme - 25 janv. 2009 à 06:26
bjr tt

comment obtenir en java la taille réelle d'un fichier.(n'est pas la taille sur le disque)

Merci pour votre aide.

2 réponses

chris081 Messages postés 90 Date d'inscription mercredi 24 décembre 2008 Statut Membre Dernière intervention 4 février 2009
24 janv. 2009 à 19:27
Salut
Ca dépends de la taille des clusters du disque. Je ne crois pas que tu puisse récupérer une telle information en Java, a moins que tu n'utilises l'interface native avec un code en C++.
Si tu souhaites t'y aventurer, alors voila:

Comment ca fonctionne?
Suppossons un fichier qui contient 6 caractères ("abcdef") et que chacun des caractères est codé sur 1 octets. La taille réelle du fichier est de 6 octets. Cependant, la taille des clusters de ton disque dur est de 4 octets. Puisque les données de ton fichier ne peuvent être insérées dans un seul cluster, elle seront insérées dans 2 cluster. Étant donné qu'un cluster ne peut être vide, alors ton système d'exploitation écrira des bytes nul (0) pour complèter le second cluster. Ce qui te donnera une taille virtuelle de 8 octets pour un fichier contenant 6 caractères!.

(ce n'est pas pertinent pour le calcul, mais...). Tu as fermé ce fichier et tu l'as enregistré. 2 jours plus tard, tu ajoutes a ce fichier " 12345" (donc 6 nouveau octets supplémentaires). Cependant, la rotation du disque interne a ton disque dur fait que lorsque tu enregistres ce fichier, les clusters ou il enregistre les données ne sont pas a la suite des clusters du premier enregistrement. Alors le disque dur écrit les nouvelles données dans 2 nouveau cluster de 4 octets chaque. (1 plein de 4 octets, et 1 de 2 octets, qu'il emplit avec des 0). Donc tu as maintenant un fichier avec une taille réelle de 12 octets, une taille virtuelle de 16 octets et ce fichier est répartit en 4 clusters.


Lorsque tu effectuera une défragementation de ton disque dur, le defragmenteur prendra
les 2 premiers octets du 3e cluster et écrasera les 2 derniers octets du 2e cluster.
Il prendra les 2 derniers octets du 3e cluster et les inséreras comme étant les 2 premiers
octets du 3e cluster. Il prendra alors les 2 premiers octets du 4e cluster, et les insérera
a la fin du 3e cluster, libérant ainsi le 4e cluster:


avant defragmentation
[abcd] [ef00] [ 123] [4500]


defragmentation en cours
[abcd] [ef 1] [0023] [4500]

: [abcd] [ef 1] [2300] [4500]

: [abcd] [ef 1] [2345] [0000]


apres defragmentation : [abcd] [ef 1] [2345]

ton fichier a maintenant une taille réelle et virtuelle de 12 octets!

C'est ainsi que ca fonctionne sous Windows. J'imagine que c'est similaire sous Linux, sauf qu'au mieux de mes connaissances, il n'y a pas d'utilitaires permettant de défragmenter sous Linux, alors j'ignore ce qui se produit quand un fichier a une taille qui n'emplit pas complètement les clusters du disque.
J'espère que ca t'aide un petit peu

chris081

<hr align="left" width="10%" />

Est-ce que les femmes pètent autant que les hommes ?
Oui. Cependant, les hommes semblent en tirer plus de gloire que les femmes.

Retrouvez l'intégrale ici
0
Utilisateur anonyme
25 janv. 2009 à 06:26
Bonjour,

Voici une méthode qui permet de le faire :

import

java.io.*;

-------
--------

static
final String nL1 = System.getProperty("line.separator");
staticfinal String nL2 = nL1 + nL1;

static String monFichier = "leFichier.sonType";
static
String info = "";
static File ficouv, objFichier;

-----------------------

---------------------------

// la methode
public
staticvoid InfosFichier()
{
info = nL1 + "INFOS Fichier " + monFichier + nL2;
//info = nL1 + "INFORMACIONES SOBRE " + monFichier + nL2;

File fic = new File(monFichier);
ficouv = fic;

long tailfic;
float tailkb;

info+= nL1
+ "C'est " + ficouv + " qui est ouvert, ";
// + "Es " + ficouv + " el que está abierto, ";
tailfic = ficouv.length();
tailkb = (float
)tailfic / 1024;
if (tailfic != 0)
{
info+= nL1
+ "sa taille est de "
//+ "su tamanio es de "

+ tailkb + " KB,";
}
javax.swing.JOptionPane.showMessageDialog(null,info);
}

-------------------
--------------------
//appel de la methode:

InfosFichier();

Cordialement,

...\ Dan /...
0