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

Entrée/Sortie Java Discussion :

Copie de fichiers


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut Copie de fichiers
    Bonjour,

    Suite à une copie de fichiers réalisée en java (ou via un logiciel), j'ai remarqué qu'il est fréquent que les tailles sur le disque des fichiers sources et cibles (affichées par windows) sont très légèrement différentes. Cela vient-il de windows ? de la façon de copier le fichier ? du disque lui même ? de la façon de lire la taille des fichiers selon windows ?

    merci.

  2. #2
    Membre confirmé Avatar de dinver
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 122
    Par défaut
    Tu es sure de poser la question dans le bon forum :

  3. #3
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    ben elle est valable aussi pour le forum windows. en fait j'ai fait une application réseau pour copier un fichier et ce fichier. Après plusieurs copies, le fichier n'a plus forcément la même taille qu'à l'origine... je vois pas d'où ça vient ?

  4. #4
    Membre confirmé Avatar de dinver
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 122
    Par défaut
    Citation Envoyé par FFF
    ben elle est valable aussi pour le forum windows. en fait j'ai fait une application réseau pour copier un fichier et ce fichier. Après plusieurs copies, le fichier n'a plus forcément la même taille qu'à l'origine... je vois pas d'où ça vient ?
    assez bizarre

    Une question toute bête, lorsque la taille a changé le fichier reste accessible càd CRC ok en d'autre terme tu peux lire ton fichier et ses données ne sont pas corrompus ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Une question bete, ca pourrait pas venir soit d'un writer pas bien fermé a la fin, soit de fin de lignes pas tout a fait ecrites comme dans les fichier source ?

    A priori, la taille doit etre la meme, un octet d'un poste a l'autre reste un octet et fait toujours 8 bits... Donc, pas normal...

  6. #6
    Membre confirmé Avatar de dinver
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 122
    Par défaut
    Citation Envoyé par ghorgor
    Une question bete, ca pourrait pas venir soit d'un writer pas bien fermé a la fin, soit de fin de lignes pas tout a fait ecrites comme dans les fichier source ?

    A priori, la taille doit etre la meme, un octet d'un poste a l'autre reste un octet et fait toujours 8 bits... Donc, pas normal...
    C'est pour ça que je me demande si le fichier dont la taille n'est pas la même ne doit pas être le même. Soit qu'il est corrompu soit qu'il y a eu une modification quelconque lors de l'envoie du fichier par réseau

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Par défaut
    Tiens, d'ailleurs, tu l'envoies comment ton fichier par le reseau ?

    c'est en texte, en binaire, les deux ?

    Tires tu bien la chasse a la fin de l'envoi ? (Flush...)

  8. #8
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    en fait mon programme est assez compliqué. Mais grosso modo j'envoie la fichier sous forme de byte (bien qu'il y ait eu découpage par morceau puis compression....)
    Les fichiers copiés ne sont pas corrompus car ils sont tout à fait lisibles...
    J'ai essayé avec de la musique, du texte et les fichiers ne sont pas corrompus.
    Non je n'ai pas mis de flush() (le programme d'envoi est une classe ftp téléchargée depuis ce site). Mais j'utilise à chaque envoi une nouvelle classe ftp, donc à priori le buffer est vide à chaque fois... . Dois-je en rajouter ?

    Mais cette erreure n'est pas sytématique, il arrive souvent que le fichier copié ait la même taille que celui d'origine...

    Merci pour vos réponses

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu aurais du préciser de suite que ce n'est pas une copie en local mais par FTP !!!

    Lors de l'envoi de fichiers par FTP en mode ASCII, les fin de ligne sont transformé afin de gérer les différences entres les systèmes (\n sous *n*x, \r sous Mac, et \n\r ou \r\n sous Windows).

    Il est donc possible que les fichiers changent de tailles...
    Si généralement cela n'a pas trop d'impact pour les fichiers textes, c'est plus délicat pour les fichiers binaires qui peuvent être altéré...

    Dans ce cas il faut faire le tranfert en mode binaire afin que le fichier soit envoyé tel quel !

    a++

  10. #10
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    Tu aurais du préciser de suite que ce n'est pas une copie en local mais par FTP !!!
    désolé ! !

    Lors de l'envoi de fichiers par FTP en mode ASCII, les fin de ligne sont transformé afin de gérer les différences entres les systèmes (\n sous *n*x, \r sous Mac, et \n\r ou \r\n sous Windows).

    Il est donc possible que les fichiers changent de tailles...
    Si généralement cela n'a pas trop d'impact pour les fichiers textes, c'est plus délicat pour les fichiers binaires qui peuvent être altéré...

    Dans ce cas il faut faire le tranfert en mode binaire afin que le fichier soit envoyé tel quel !
    effectivement je crois que tu tapes dans le mille puisque ma classe ftp ne semble pas activer le mode binaire par défaut lors de l'upload de fichier...
    sachant que j'upload sur un serveur linux ! De plus la différence de taille n'est de quelques octets supplémentaires sous windows... mais ça n'explique pas pourquoi certaines fois j'ai une copie exacte (le bol ?, le serveur ftp qui travaille ?)...

    je vais activer le mode binaire manuellement donc.
    Merci pour vos réponses.

    PS :
    ce qui m'avais poussé à accusé windows au début c'est que j'avais effectué une copie d'un fichier de 1 Go sur un disque externe (usb) et j'obtenais une différence de taille de quelques octets là aussi (je pensais que cela pouvais venir du format des disques dur qui étaient différents (histoires de tailles d'allocation 2048, 4096..)mais j'y connais rien dans ce domaine donc ce ne sont que des hypothèses.
    bizzard... peut être cela vient de l'usb qui fait des écritures incertaines...

  11. #11
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Et le type d'encodage utilisé ?

  12. #12
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    Citation Envoyé par ze_key
    Et le type d'encodage utilisé ?
    je ne vois pas de quoi tu parles ? précise.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Par défaut
    Ca peut venir des file systems et de la taille de leurs secteurs.

    Si je ne dis pas de bêtises, un fichier occuppe toujours un nombre entier de secteurs sur un disque. Par conséquent, un fichier possède :
    * une taille réelle
    * une taille occuppée sur le disque qui est un multiple de la taille des secteurs.

    La taille des secteurs n'étant pas à priori la même sur 2 systèmes de fichiers différents, tu obtiens des tailles apparentes différentes.

  14. #14
    Membre Expert
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Par défaut
    Ben selon le type d'encodage des caractères ascii/utf8/16. Mais vraisemblablement ce serait plutot un probleme de taille de bloc.
    Pour etre sure tu pourrais executer l'outil md5sum sur les deux systeme et vérifé que le checksum est bien identique, si c'est le cas alors il s'agit plus vraisembleblement d'une différence de blocs de données.

  15. #15
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 19
    Par défaut
    Bonjour,

    j'ai le même problème...

    J'ai une appli qui fait des sauvegardes de fichiers d'un disque vers un autre. Les fichiers sauvegardés sont des fichiers binaires (images, mp3, vidéos...) et lors de la copie, j'ai remarqué effectivement que la taille du fichier destination n'est pas toujours la même que celle du fichier d'origine. Même lorsque la taille est modifiée, le fichier destination reste lisible mais dans le cas de fichiers mp3, les tags ID3 semblent être perdues. A priori, le problème se manifeste toujours sur les mêmes fichiers.

    Je constate ce problème même lors de mes tests en local sur mon PC. Dans cet environnement, les fichiers sont copié d'un répertoire vers un autre. Les deux répertoires sont sur le même disque et la même partition.

    ma méthode de copie de fichiers est toute simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void copyFile(File srcFile, File dstFile) throws IOException, FileNotFoundException {
       byte[] buffer = new byte[5000];
       FileOutputStream fos = new FileOutputStream(dstFile);
       FileinputStream fis = new FileinputStream(srcFile);
       while(fis.read(buffer) != -1) {
          fos.write(buffer);
       }
       fis.close();
       fos.close();
    }
    si vous avez des pistes, je suis preneur.

    merci

  16. #16
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    La méthode write(byte[]) écrit la totalité du buffer dans le fichier. Or lorsque tu arrives à la fin du fichier, il y a de fortes chances que ton buffer ne soit pas rempli (du coup le reste du buffer comporte les éléments lu précédemment)...

    Il faut donc que tu conserves le nombre de caractères lu par read() pour n'écrire que ceux-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void copyFile(File srcFile, File dstFile) throws IOException, FileNotFoundException {
    	byte[] buffer = new byte[5000];
    	int readCount = 0;
    	FileOutputStream fos = new FileOutputStream(dstFile);
    	FileinputStream fis = new FileinputStream(srcFile);
     
    	while( (readCount = fis.read(buffer)) != -1) {
    		fos.write(buffer, 0, readCount);
    	}
     
    	fis.close();
    	fos.close();
    }
    a++

  17. #17
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 19
    Par défaut
    je suis une buse.... ca m'apprendra à mieux lire les javadoc.

    Merci pour la réponse rapide.

  18. #18
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    ne serait-il pas préférable d'écrire ta méthode de copie ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static void copyFile(File srcFile, File dstFile) throws IOException, FileNotFoundException {
       static final int SIZE = 5 * 1024;
       byte[] buffer = new byte[SIZE];
       long read = 0;
       FileOutputStream fos = new FileOutputStream(dstFile);
       FileinputStream fis = new FileinputStream(srcFile);
       while((read = fis.read(buffer, 0, SIZE)) != -1) {
          fos.write(buffer, 0, read);
       }
       fis.close();
       fos.close();
    }

  19. #19
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jowo
    ne serait-il pas préférable d'écrire ta méthode de copie ainsi:
    Pas forcément puisque le code suivant :
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(buffer, 0, buffer.length);
    Il n'y a donc pas de risque de buffer-overflow (si c'est bien à quoi tu pensais)...

    a++

  20. #20
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par adiGuba
    Citation Envoyé par jowo
    ne serait-il pas préférable d'écrire ta méthode de copie ainsi:
    Pas forcément puisque le code suivant :
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(buffer, 0, buffer.length);
    Il n'y a donc pas de risque de buffer-overflow (si c'est bien à quoi tu pensais)...

    a++
    Non, je pensais plutôt au problème que tu as soulevé avec le write.

    Avec read(buffer, 0, buffer.length), on est un "petit schouia" plus rapide vu que nous avons un appel à une méthode en moins.
    [/code]

Discussions similaires

  1. Copie de fichier sur le bureau
    Par LoicH dans le forum C++Builder
    Réponses: 3
    Dernier message: 01/05/2005, 20h57
  2. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/12/2004, 22h39
  3. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows
    Réponses: 5
    Dernier message: 20/12/2004, 22h35
  4. [Kylix] Copie de fichier...
    Par paty.olivier dans le forum EDI
    Réponses: 1
    Dernier message: 23/06/2004, 12h55
  5. Copie de fichier
    Par Bjorn dans le forum C
    Réponses: 4
    Dernier message: 11/06/2002, 15h23

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