Перемещение содержимого файла

112
19 февраля 2021, 00:40

Необходимо организовать перемещение содержимого файла блоками. Например скопировать первые 20 байт в другой файл, а в исходном их удалить.

Пробовал так:

if(result == QDialog::Accepted)
    {
        QFile source("/home/vivo/test");
        source.open(QIODevice::ReadWrite);
        QFile destination("/home/vivo/testcopy");
        if (!destination.exists())
        {
            creat("/home/vivo/testcopy", 0777);
        }
        destination.open(QIODevice::WriteOnly | QIODevice::Append);
        if (destination.isOpen() && source.isOpen())
        {
            bool OK;
            int block = QInputDialog::getInt(nullptr, "Размер блока", "Укажите размер блока: ", QLineEdit::Normal, 0, 100, 2, &OK);
            if(OK)
            {
                QByteArray empty(block, 0x0);
                QByteArray buffer;
                buffer = source.read(block);
                destination.write(buffer);
                source.seek(0);
                source.write(empty);
            }
            else
            {
                QByteArray buffer;
                QByteArray empty(source.size(), 0x0);
                buffer = source.readAll();
                destination.write(buffer);
                source.write(empty);
            }
            destination.close();
            source.close();
        }
        else
        {
            QMessageBox::warning(this,"Ошибка", "Не удалось открыть Ошибка", "Не удалось открыть файл");
        }
    }

Это работает, но только 1 раз. При повторном перемещении MessageBox не выскакивает, файлы открываются, но данные не перемещаются. В чем моя ошибка?

Answer 1

Вы не удаляете первые 20 байт из исходного файла, а перезаписываете их нулями. Соответственно во второй раз у вас копируются нули, которые потом оказываются во втором файле. Вам следует перечитать всё содержимое исходного файла начиная с 20-й позиции и перезаписать начало файла.

READ ALSO
Создать QIODevice (QSerialPort) в отдельном потоке

Создать QIODevice (QSerialPort) в отдельном потоке

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

148
map перезаписывает элемент а не добавляет

map перезаписывает элемент а не добавляет

Метод map перезаписывает элемент а не добавляет новый, пробовал и методом emplace и pair, в чем ошибка подскажите?

113
Как работает istream& параметр?

Как работает istream& параметр?

Помогите разобраться нубу с тем, как работает istream&, конкретно интересует следующая конструкция:

114
Как присвоить wchar[256] переменную?

Как присвоить wchar[256] переменную?

Есть текстовый файл в котором хранится ссылка к примеру (https://rustackoverflow

117