Comment copier un grand fichier dans Windows XP?

j'ai un grand fichier dans windows XP - its 38GB. (une image VM)

Je ne peux pas le copier.

glisser sur le bureau - donne une erreur de "ressources système insuffisantes existent pour compléter le service demandé"

Utilisant Java-FileChannel.transferTo (0, fileSize, dest) échoue pour tous les fichiers > 2Go

Utilisant Java-FileChannel.transferTo () en morceaux de 100Mb échoue après ~18Gb

java.io.IOException: Insufficient system resources exist to complete the requested service
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.FileDispatcher.write(FileDispatcher.java:44)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:72)
at sun.nio.ch.IOUtil.write(IOUtil.java:28)
at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:198)
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:439)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510)

je veux dire - l'ordinateur a 3 Go de RAM. Un tampon de 100 Go devrait suffire!?!?

apparemment, les commandes DOS "copy" et "xcopy" échouent aussi.

(edit) J'ai essayé la copie et XCOPY - ceux-ci échouent avec la même erreur. La XCOPIE semble prendre beaucoup de temps.

J'ai entendu parler de Robocopy, mais il ne copie pas les fichiers?

je sens vraiment que Windows est pour le perdre le droit maintenant. Microsoft a sûrement entendu parler de fichiers plus grands que quelques GO?

Merci!

2
demandé sur time4tea 2010-12-15 00:02:58

8 réponses

en Java, n'essayez pas de copier le fichier entier en une seule opération. La méthode transferTo() fonctionne sur des morceaux d'un fichier; elle n'a pas été conçue comme une méthode de copie de fichier de haut niveau. Invoquer transferTo() dans une boucle, et supposer que count octets de données seront en RAM (c.-à-d., abaisser ce paramètre pour être confortable ajustement en RAM).

FileChannel src = ... 
FileChannel dst = ...
final long CHUNK = 16 * 1024 * 1024; /* 16 Mb */
for (long pos = 0; pos < fileSize; ) {
  pos += src.transferTo(pos, CHUNK, dst);
}

le commentaire dans le JavaDoc transferTo() que c'est "plus efficace qu'une simple boucle" se réfère au fait que les voies de communication peut être optimisé en plus de canal-de-l'utilisateur-espace-canal. n'est pas signifie que tous les le bouclage peut être évitée.

2
répondu erickson 2010-12-14 21:16:12

je suis un utilisateur VMware ESX, j'ai 30 VM de production avec le plus grand étant 232GB. Je sauvegarde mes instances VM sur un disque SATA interne et puis je les Copie une fois par semaine à une eSata externe. J'utilise teracopy (gratuit), il tourne en moyenne à 45MB/s sur une machine XP avec 3 Go.

Espère que ça aide Sailen

2
répondu Sailen 2011-01-21 03:46:08

bien-je n'ai pas réussi à trouver un moyen qui fonctionne.

aucun des outils packagés dans windows ne copiera le fichier. Glisser - déposer, copier, XCOPY, java-tous ne parviennent pas à copier le fichier.

la raison pour laquelle je voulais copier le fichier était pour une sauvegarde avant de faire une mise à jour du système D'exploitation.

à la fin, je suis entré dans knoppix et je l'ai copié.

1
répondu time4tea 2011-01-11 15:15:17

jetez un coup d'oeil à ce Hotfix , mérite un essai car tout ce que j'ai vu pointe à ceci comme étant un remède pour votre problème.

EDIT : vous pouvez également essayer XCOPY /Z comme indiqué ici .

0
répondu Aaron McIver 2010-12-14 21:52:33

il peut y avoir aussi un problème de matériel.. Je soupçonne que vous n'avez pas beaucoup de temps, mais vous pouvez essayer la solution de ruisseau plus stupide et ne pas mettre de grands tampons (8-16MB devrait être suffisant):

public static void copy(InputStream input, OutputStream output) throws IOException {
     byte[] buffer = new byte[1024 * 1024 * 8]; // 8MB
     int n = 0;
     while (-1 != (n = input.read(buffer))) {
         output.write(buffer, 0, n);
     }
}

public static void main(String args[]) {

    if (args.length != 2) {
        System.err.println("wrong argument count");
        System.exit(1);
    }

    FileInputStream in = null;
    FileOutputStream out = null;

    try {
        in = new FileInputStream(new File(args[0]));
        out = new FileOutputStream(new File(args[1]));
        copy(in, out);
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (in != null) { try { in.close(); } catch (Exception e) {}}
    if (out != null) { try { out.close(); } catch (Exception e) {}}

}
0
répondu barti_ddu 2010-12-14 22:05:24

êtes-vous sûr que le système de fichiers est capable de gérer de tels gros fichiers (FAT32 ne peut pas par exemple)? Consultez ce lien pour plus de détails http://www.ntfs.com/ntfs_vs_fat.htm

le système est 32 ou 64 bits? Sur 32-bit, Vous pouvez avoir des problèmes de copie de fichiers plus grand que 2-4Gb.

aussi, vous avez dit que rsync vous arnaque. J'ai eu une très belle expérience avec elle, copier entre 2 disques durs à une vitesse presque native. J'ai eu beaucoup de petits fichiers..tu as l'air d'avoir sur big blob à la place.

, Vous pouvez aussi essayez de diviser le gros blob en petites gouttes:)

0
répondu Quamis 2010-12-15 12:48:26
final long CHUNK = 16 * 1024 * 1024; /* 16 Mb */
for (long pos = 0; pos < fileSize; pos++) {   
     pos += src.transferTo(pos, CHUNK, dst); 
} 

ça marche! assurez-vous juste que votre src et dst sont des objets FileChannel (entrée, sortie respectivement)

0
répondu joe coder 2011-01-06 20:29:54

une autre réponse possible est Files.copie (java NIO 2), par exemple:

Path sourcePath      = Paths.get("big-file.dat");
Path destinationPath = Paths.get("big-file-copy.dat");

try {
    Files.copy(sourcePath, destinationPath,
            StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
    // something else went wrong
    e.printStackTrace();
}
0
répondu adrhc 2018-08-10 16:16:36