Как скопировать большой файл в Windows XP?

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

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

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

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

Использование Java - FileChannel.transferTo() в кусках 100Mb не работает после ~ 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)

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

По-видимому, команды DOS "copy" и "xcopy" также терпят неудачу.

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

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

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

Спасибо!

Ответ 1

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

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

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

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

Ответ 2

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

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

Комментарий в transferTo() JavaDoc о том, что он "более эффективен, чем простой цикл", относится к тому факту, что связь между каналами может быть оптимизирована больше, чем канал от пользователя к каналу. Это не означает, что можно избежать всех циклов.

Ответ 3

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

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

Ответ 4

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

EDIT. Вы также можете попробовать XCOPY/Z, как указано здесь.

Ответ 5

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

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) {}}

}

Ответ 6

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

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

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

Вы также можете попробовать расщепить большую блоб на более мелкие капли:)

Ответ 7

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

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