bool Linux_Comander::CopyFolder(QString strFrom, QString strTo)//функция копирования папок с их содержимым.{ QDir dir; //strFrom - имя папки, откуда копировать //strTo - имя папки, куда копировать //убедимся, что имена заканчиваются слэшем, если нет - добавим if (strTo.right(1) != "") strTo += '/'; if (strFrom.right(1) != "") strFrom += '/'; //создаем ("копируем") текущую папку QDirIterator itr(strFrom,QDirIterator::Subdirectories); if (!dir.mkdir(strTo)) { QMessageBox::information(this,"Ошибка создания","Не удалось создать директорию "+strTo); return false; } //будем перебирать все файлы и папки в текущей директории while(itr.hasNext()) { QString strFilePath = itr.next(); QString strFileTitle = itr.fileName(); //отсекаем "." и ".." if ((itr.fileName() != ".") && (itr.fileName() != "..") && (itr.fileName() != "")) { begin->setText("Из: "+strFilePath); end->setText("В: "+ strTo + strFileTitle); if (itr.fileInfo().isDir()) { //рекурсивное погружение в найденную папку (strTo + strFileTitle) CopyFolder(strFilePath, strTo + strFileTitle); } else { QFile file(strFilePath),f(strTo + strFileTitle); file.open(QIODevice::ReadOnly);//открываем его на чтение f.open(QIODevice::WriteOnly);//на запись qint64 bytes_write = 0; qint64 i = 0; bar->setMaximum(file.size()); while (!file.atEnd())//запускаем цикл в котором файл копируется построчно { bytes_write = f.write(file.readLine());//построчное записывание i += bytes_write; bar->setValue(i); } bar_all->setValue(full_size); full_size += f.size(); if (full_size >=1073741824) { bar_size->setText("Скопировано: "+ QString::number(full_size/1073741824) + " Gbyte"); } if (full_size >= 1048576) { bar_size->setText("Скопировано: "+ QString::number(full_size/1048576) + " Mbyte"); } if (full_size >= 1024) { bar_size->setText("Скопировано: "+ QString::number(full_size/1024) + " Kbyte"); } else { bar_size->setText("Скопировано: "+ QString::number(full_size) + " Byte"); } } } } return true;}
C++ (Qt) QDirIterator itr(strFrom,QDirIterator::Subdirectories);
if (itr.fileInfo().isDir()) { strTo += strFileTitle; if (strTo.right(1) != "") { strTo += '/'; } if (!dir.mkdir(strTo)) { QMessageBox::information(this,"Ошибка создания","Не удалось создать временную директорию "+strTo); return false; } continue; }
strTo += strFileTitle; if (strTo_Vr.right(1) != "") { strTo += '/'; }
QDirIterator it("/etc", QDirIterator::Subdirectories); while (it.hasNext()) { qDebug() << it.next(); // /etc/. // /etc/.. // /etc/X11 // /etc/X11/fs // ... }
void Linux_Comander::progress_bar()//функция отображения хода копирования{ QVBoxLayout *laytbar = new QVBoxLayout; QVBoxLayout *layt_b = new QVBoxLayout; QVBoxLayout *layt_e = new QVBoxLayout; QVBoxLayout *layt_size = new QVBoxLayout; QHBoxLayout *layt_button = new QHBoxLayout; QHBoxLayout *layt_speed = new QHBoxLayout; QPushButton *close_but = new QPushButton; QPushButton *cancel_but = new QPushButton; begin = new QLabel; end = new QLabel; bar_size = new QLabel; block_copy = new QLabel; speed = new QLabel; prog_dialog = new QWidget; bar = new QProgressBar; bar_all = new QProgressBar; begin->setWordWrap(true); end->setWordWrap(true); bar_size->setAlignment(Qt::AlignHCenter); block_copy->setAlignment(Qt::AlignHCenter); speed->setAlignment(Qt::AlignHCenter); layt_b->addWidget(begin); layt_e->addWidget(end); layt_speed->addWidget(block_copy); layt_speed->addWidget(speed); layt_speed->setAlignment(layt_speed,Qt::AlignHCenter); layt_size->addWidget(bar_size); layt_size->addLayout(layt_speed); layt_button->addWidget(close_but); layt_button->addWidget(cancel_but); layt_button->setContentsMargins(100,1,100,1); laytbar->addLayout(layt_b); laytbar->addLayout(layt_e); laytbar->addWidget(bar); laytbar->addWidget(bar_all); laytbar->addLayout(layt_size); laytbar->addLayout(layt_button); prog_dialog->setLayout(laytbar); prog_dialog->setWindowModality(Qt::WindowModal); prog_dialog->setGeometry((x/2)-(450/2),(y/2)-(140/2),450,140);//устанавливаем диалог в центре экрана prog_dialog->setStyleSheet("background-color: #CCCCCF");//цвет диалога prog_dialog->setWindowTitle("Копирование");//заголовок prog_dialog->setFont(QFont("",14,71)); bar_all->setMaximum(max_bar_all); bar->setAlignment(Qt::AlignHCenter); bar_all->setAlignment(Qt::AlignHCenter); close_but->setText("Закрыть"); cancel_but->setText("Отменить"); prog_dialog->show(); connect(cancel_but,SIGNAL(clicked()),prog_dialog,SLOT(deleteLater())); connect(close_but,SIGNAL(clicked()),prog_dialog,SLOT(close()));}
bool Linux_Comander::CopyFolder(QString strFrom, QString strTo){ progress_bar();............}