В каких случаях QFile::copy и QDir::rename возвращает false?

180
29 августа 2018, 14:00

недавно в универе задали написать файловый менеджер в стиле Total Commander. Я решил использовать для этого Qt Creator, так как мне он нравится. Возникла проблема переноса файлов и папок в другие директории. Большинство ситуаций решает вот этот код:

    void MainWindow::on_moveButton_clicked()
{
    QFileInfo fileInfo = model->fileInfo(current_index);
    if(fileInfo.isDir())
    {
        QDir dir = fileInfo.absoluteFilePath();
        QString oldPath = fileInfo.absoluteFilePath();
        if(current_panel == ui->leftPanel)
        {
            QString newPath = rightPath + '/' + fileInfo.fileName();
            if(!dir.rename(oldPath, newPath))
            {
                QMessageBox::critical(this, "Error", "That folder can't be moved");
            }
        }
        else if(current_panel == ui->rightPanel)
        {
            QString newPath = leftPath + '/' + fileInfo.fileName();
            if(!dir.rename(oldPath, newPath))
            {
                QMessageBox::critical(this, "Error", "That folder can't be moved");
            }
        }
    }
    else if (fileInfo.isFile())
    {
        QFile file(fileInfo.absoluteFilePath());
        bool check = true;
        if(current_panel == ui->leftPanel)
        {
            if(!file.copy(rightPath + '/' + fileInfo.fileName()))
            {
                QMessageBox::critical(this, "Error", "That file can't be moved");
                check = false;
            }
            if(check)
            {
                file.remove(fileInfo.absoluteFilePath());
            }
        }
        else if(current_panel == ui->rightPanel)
        {
            if(!file.copy(leftPath + '/' + fileInfo.fileName()))
            {
                QMessageBox::critical(this, "Error", "That file can't be moved");
                check = false;
            }
            if(check)
            {
                file.remove(fileInfo.absoluteFilePath());
            }
        }
    }
}

Но всё же существуют ситуации, которые не позволяют совершить копирование файлов/папок в другие директории. Такие ситуации возникают, когда QDir::rename или QFile::copy возвращают false. Одними из таких ситуаций являются: перемещение папки из одного диска на другой (данный случай характерен на Windows системе); копирование .exe файла. Следовательно, напрашивается вопрос: в каких случаях QDir::rename и QFile::copy возвращают false? Знание этого поможет исправить вышеупомянутые случаи и поможет нормализовать работу функции перемещения/копирования файлов/папок в другие директории.

READ ALSO
Синтаксис классов/структур c++

Синтаксис классов/структур c++

Имеется такой класс для, например, вывода вектора через библиотеку algorithmОбъясните по какому принципу myobject работает в коде и что это вообще...

196
Как выбрать все item в QTreeWidget, которые отмечены?

Как выбрать все item в QTreeWidget, которые отмечены?

Как выбрать все Item в QTreeWidget у которых статус Qt::Checked

196
Создание потока в методе класса

Создание потока в методе класса

Не получается создать поток thread (c++11) внутри метода класса - каждый раз ошибка компиляции:

180
Segmentation fault в реализации класса Any

Segmentation fault в реализации класса Any

В процессе изучения C++ решал вот эту задачуЕсли кратко, то экземпляры нешаблонного класса Any (который и нужно реализовать) должны иметь способность...

191