Я разрабатываю приложение, которое должно копировать множество файлов из одной папки в другую, используя QT (5.6.1)
Для этого я использую метод QFile::copy()
. Это хорошо работает, за исключением одного: он чрезвычайно медленный. Выполняется более чем в два раза больше времени, когда одна и та же операция копирования выполняется с помощью обозревателя Windows.
Удивляясь, почему это было, я ворвался в исходный код QT, и нашел это в qfile.cpp
, что выглядит актуальным:
char block[4096];
qint64 totalRead = 0;
while(!atEnd()) {
qint64 in = read(block, sizeof(block));
if (in <= 0)
break;
totalRead += in;
if(in != out.write(block, in)) {
close();
d->setError(QFile::CopyError, tr("Failure to write block"));
error = true;
break;
}
}
Итак, из того, что я понимаю, операция копирования использует 4096-байтовый буфер. Это очень мало для операции копирования и вполне может быть причиной проблемы. Так что я сделал, изменил размер буфера на:
char block[4194304]; // 4MB buffer
Затем я перестроил всю библиотеку QT, чтобы включить это изменение. Однако вся модификация полностью нарушила метод. Теперь, когда мое приложение пытается вызвать QFile:: Copy(), операция немедленно прерывается (метод даже не запускается, останавливается перед первой строкой в соответствии с отладчиком QtCreator). Отладчик говорит мне:
The inferior stopped because it received a signal from the Operating System.
Signal name :
SIGSEGV
Signal meaning :
Segmentation fault
Мой С++ немного ржавый, но я не понимаю, как просто изменить размер выделения массива может полностью нарушить метод... может ли кто-нибудь помочь либо:
1) Расскажите, почему QFile: Copy() настолько медленный (я что-то упускаю? Это не только на моем ПК, протестированном на нескольких разных машинах). И действительно ли коллаптик - это код, который я написал выше или что-то еще? 2) Расскажите, почему это одно изменение полностью нарушает QFile