Как скопировать большой файл в Windows XP? - PullRequest
3 голосов
/ 15 декабря 2010

У меня большой файл в Windows XP - его 38 ГБ. (образ виртуальной машины)

Я не могу его скопировать.

Перетаскивание на рабочий стол - выдает ошибку «Недостаточно системных ресурсов для завершения запрошенной услуги»

Использование Java - FileChannel.transferTo (0, fileSize, dest) завершается ошибкой для всех файлов> 2 ГБ

Использование Java - FileChannel.transferTo () порциями по 100 МБ завершается ошибкой после ~ 18 ГБ

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)

Я имею в виду - на компьютере 3 ГБ ОЗУ. 100 ГБ буфера должно быть достаточно!?!?

Очевидно, что команды DOS "copy" и "xcopy" также не выполняются.

(редактировать) Я пробовал COPY & XCOPY - они терпят неудачу с той же ошибкой. XCOPY, похоже, тоже очень долго об этом говорит.

Я слышал о Robocopy, но он не копирует отдельные файлы?

Я действительно чувствую, что Windows сейчас в проигрыше. Конечно, Microsoft слышал о файлах размером более нескольких ГБ?

Спасибо!

Ответы [ 8 ]

2 голосов
/ 15 декабря 2010

В Java не пытайтесь скопировать весь файл за одну операцию.Метод transferTo() работает с кусками файла;не предназначался как метод копирования файлов высокого уровня.Вызвать transferTo() в цикле и предположить, что count байт данных будет в ОЗУ (т. Е. Уменьшить этот параметр, чтобы было удобно вписаться в ОЗУ).Комментарий в transferTo() JavaDoc о том, что он «более эффективен, чем простой цикл», относится к тому факту, что межканальная связь может быть оптимизирована в большей степени, чем межканальное пространство.Это не означает, что можно избежать всех циклов.

2 голосов
/ 21 января 2011

Я пользователь Vmware ESX, у меня 30 рабочих виртуальных машин, самая большая из которых составляет 232 ГБ. Я копирую свои экземпляры виртуальных машин на внутренний диск SATA, а затем копирую их раз в неделю на внешний eSata. Я использую теракопию (бесплатно), она работает в среднем со скоростью 45 МБ / с на компьютере с XP и 3 ГБ.

Надеюсь, это поможет Sailen

1 голос
/ 11 января 2011

Хорошо - мне не удалось найти способ, который работает.

Ни один из упакованных инструментов в Windows не будет копировать файл. Перетаскивание, COPY, XCOPY, Java - все не удается скопировать файл.

Причина, по которой я хотел скопировать файл, была для резервной копии перед обновлением ОС.

В конце я загрузился в knoppix и скопировал его.

0 голосов
/ 10 августа 2018

Другой возможный ответ - Files.copy (java NIO 2), например ::100100

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 голосов
/ 06 января 2011
final long CHUNK = 16 * 1024 * 1024; /* 16 Mb */
for (long pos = 0; pos < fileSize; pos++) {   
     pos += src.transferTo(pos, CHUNK, dst); 
} 

Это работает! просто убедитесь, что ваши src и dst являются объектами FileChannel (соответственно, для ввода, вывода)

0 голосов
/ 15 декабря 2010

вы уверены, что файловая система на самом деле способна справляться с такими большими файлами (FAT32 не может, например)? Подробнее смотрите по этой ссылке http://www.ntfs.com/ntfs_vs_fat.htm

Система 32 или 64 битная? На 32-битной системе могут возникнуть проблемы при копировании файлов размером более 2-4 ГБ.

Кроме того, вы сказали, что rsync для вас. У меня был очень хороший опыт, копируя между 2 жесткими дисками на почти родной скорости. У меня было много маленьких файлов ... вы, кажется, вместо этого использовали большой блоб.

Вы также можете попробовать разбить большой шарик на более мелкие:)

0 голосов
/ 15 декабря 2010

Также может быть проблема с оборудованием. Я подозреваю, что у вас мало времени, однако вы можете попробовать решение с более тупыми потоками и не устанавливать большие буферы (8-16 МБ должно быть достаточно):

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 голосов
/ 15 декабря 2010

Взгляните на это Исправление , которое стоит попробовать, поскольку все, что я видел, указывает на то, что это лекарство от вашей проблемы.

РЕДАКТИРОВАТЬ : Вы также можете попробовать XCOPY / Z, как указано здесь .

...