一:文件拷贝
widget.h
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public:
// 批量拷贝文件
void copy(QStringList sourceFilesList, QString toDir, bool coverFileIfExist);
// 拷贝单个文件
bool copy(QString sourceFile, QString toDir, bool coverFileIfExist);
private:
Ui::Widget *ui;
private:
QStringList sourceFilesList;
private slots:
void on_btnSourceFiles_clicked();
void on_btnDestDir_clicked();
void on_btnCopy_clicked();
};
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QMessageBox>
#include <QTextStream>
#pragma execution_character_set("utf-8")
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowFlags( windowFlags() & ~ Qt::WindowMaximizeButtonHint | Qt::MSWindowsFixedSizeDialogHint );
}
Widget::~Widget()
{
delete ui;
}
void Widget::copy(QStringList sourceFilesList, QString toDir, bool coverFileIfExist)
{
if( !sourceFilesList.empty() )
{
foreach (QString sourceFile, sourceFilesList)
{
copy(sourceFile, toDir, coverFileIfExist);
}
}
}
bool Widget::copy(QString sourceFile, QString toDir, bool coverFileIfExist)
{
if( sourceFile == "" || toDir == "") return false;
// 判断源文件存不存在
if( !QFile::exists(sourceFile) ) return false;
toDir.replace("\\","/");
// if( sourceFile == toDir ) return true;
QDir targetDir(toDir);
// 如果目标目录不存在,则进行创建
if( !targetDir.exists() )
{
if( !targetDir.mkdir(targetDir.absolutePath()) )
return false;
qDebug() << "targetDir.absolutePath(): " << targetDir.absolutePath();
}
QFileInfo sourceDirInfo(sourceFile);
// if( !QFile::copy(sourceDir, toDir + '/' + sourceDirInfo.fileName())) // not well
if( !QFile::copy(sourceFile, targetDir.filePath(sourceDirInfo.fileName())) ) return false;
return true;
}
void Widget::on_btnSourceFiles_clicked()
{
sourceFilesList = QFileDialog::getOpenFileNames(
this,
tr("Select one or more files to open"),
"*",
tr("Files (*.all files)") );
qDebug() << "sourceFilesList: " << sourceFilesList;
if( !sourceFilesList.isEmpty() )
{
foreach (QString sourceFile, sourceFilesList)
{
if (ui->comboBox_2->findText(sourceFile) == -1)
ui->comboBox_2->insertItem(0, sourceFile);
ui->comboBox_2->setCurrentIndex(ui->comboBox_2->findText(sourceFile));
}
}
}
void Widget::on_btnDestDir_clicked()
{
QString destDir = QFileDialog::getExistingDirectory( this, tr("save to Directory"), tr("e:/") );
qDebug() << "destDir: " << destDir;
if( !destDir.isEmpty() )
{
if (ui->comboBox_3->findText(destDir) == -1)
ui->comboBox_3->insertItem(0, destDir);
ui->comboBox_3->setCurrentIndex(ui->comboBox_3->findText(destDir));
}
}
void Widget::on_btnCopy_clicked()
{
if( ui->comboBox_2->currentText() == "" || ui->comboBox_3->currentText() == "" )
return;
copy(sourceFilesList, ui->comboBox_3->currentText(), true);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
二:目录拷贝
widget.h
#include <QWidget>
#include <QDir>
#include <QComboBox>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
public:
// 为combobox插入项
void insertItemComboBox(QString item, QComboBox *comboBox);
// 查看源目录下所有文件绝对路径
void list(QString fromDir);
// 单层目录拷贝
bool copy(QString fromDir, bool coverFileIfExist);
// 多层目录拷贝
bool copy(QString fromDir, QString toDir, bool coverFileIfExist);
private:
Ui::Widget *ui;
QString _srcDir;
QString _destDir;
QDir _targetDir;
int _totalFileCount;
private slots:
void on_btnSrcDir_clicked();
void on_btnDestDir_clicked();
void on_btnSave_clicked();
};
widget.cpp
#include "Widget.h"
#include "ui_Widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::insertItemComboBox(QString item, QComboBox *comboBox)
{
if( !item.isEmpty() )
{
if( comboBox->findText(item) == -1 )
comboBox->insertItem(0, item);
comboBox->setCurrentIndex(comboBox->findText(item));
}
}
void Widget::list(QString fromDir)
{
QDir sourceDir(fromDir);
// 判断源目录存不存在
if( !sourceDir.exists() ) return;
// 目录详细信息
QFileInfoList fileInfoList = sourceDir.entryInfoList();
foreach( QFileInfo fileInfo, fileInfoList )
{
if( fileInfo.fileName() == "." || fileInfo.fileName() == ".." )
{
qDebug() << fileInfo.fileName();
continue;
}
if( fileInfo.isDir() )
{
qDebug() << "isDir(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
list(fileInfo.filePath());
}
else
{
qDebug() << "isFile(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
_totalFileCount++;
}
qDebug() << "=============================";
}
}
bool Widget::copy(QString fromDir, bool coverFileIfExist)
{
QDir sourceDir(fromDir);
// 判断源目录存不存在
if( !sourceDir.exists() ) return false;
// 目录详细信息
QFileInfoList fileInfoList = sourceDir.entryInfoList();
foreach( QFileInfo fileInfo, fileInfoList )
{
if( fileInfo.fileName() == "." || fileInfo.fileName() == ".." )
{
qDebug() << fileInfo.fileName();
continue;
}
if( fileInfo.isDir() )
{
qDebug() << "isDir(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
qDebug() << "newDir(): " << _targetDir.filePath(fileInfo.fileName());
copy(fileInfo.filePath(), coverFileIfExist);
}
else
{
qDebug() << "isFile(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
qDebug() << "newFile(): " << _targetDir.filePath(fileInfo.fileName());
// 当允许覆盖操作时,将旧文件进行删除操作
if( coverFileIfExist && _targetDir.exists(fileInfo.fileName()))
{
_targetDir.remove(fileInfo.fileName());
}
// If a file with the name newName already exists, copy() returns false (i.e., QFile will not overwrite it).
if( !QFile::copy(fileInfo.filePath(), _targetDir.filePath(fileInfo.fileName())) )
{
qDebug() << "源文件存在!";
}
}
qDebug() << "=============================";
}
return true;
}
bool Widget::copy(QString fromDir, QString toDir, bool coverFileIfExist)
{
QDir sourceDir(fromDir);
// 判断源目录存不存在
if( !sourceDir.exists() ) return false;
QDir targetDir(toDir);
// 判断目标目录存不存在,如果目标目录不存在,则进行创建
if( !targetDir.exists() )
{
if( !targetDir.mkdir(targetDir.absolutePath()) )
return false;
// qDebug() << "targetDir.absolutePath(): " << targetDir.absolutePath();
}
// 目录详细信息
QFileInfoList fileInfoList = sourceDir.entryInfoList();
foreach( QFileInfo fileInfo, fileInfoList )
{
if( fileInfo.fileName() == "." || fileInfo.fileName() == ".." )
{
qDebug() << fileInfo.fileName();
continue;
}
if( fileInfo.isDir() )
{
qDebug() << "isDir(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
qDebug() << "newDir(): " << targetDir.filePath(fileInfo.fileName());
copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), coverFileIfExist);
}
else
{
qDebug() << "isFile(): " << fileInfo.filePath() << ", " << fileInfo.fileName();
qDebug() << "newFile(): " << targetDir.filePath(fileInfo.fileName());
// 当允许覆盖操作时,将旧文件进行删除操作
if( coverFileIfExist && targetDir.exists(fileInfo.fileName()))
{
targetDir.remove(fileInfo.fileName());
}
// If a file with the name newName already exists, copy() returns false (i.e., QFile will not overwrite it).
if( !QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName())) )
{
qDebug() << "源文件存在!";
}
}
qDebug() << "=============================";
}
return true;
}
void Widget::on_btnSrcDir_clicked()
{
QString defaultDir = ui->comboSrcDir->currentText();
_srcDir = QFileDialog::getExistingDirectory( this, tr("save to Directory"), defaultDir );
qDebug() << "_srcDir: " << _srcDir;
insertItemComboBox(_srcDir, ui->comboSrcDir);
}
void Widget::on_btnDestDir_clicked()
{
QString defaultDir = ui->comboDestDir->currentText();
_destDir = QFileDialog::getExistingDirectory( this, tr("save to Directory"), defaultDir );
qDebug() << "_destDir: " << _destDir;
insertItemComboBox(_destDir, ui->comboDestDir);
}
void Widget::on_btnSave_clicked()
{
_srcDir = ui->comboSrcDir->currentText();
if(_srcDir == "")
{
QMessageBox::information(this,
"information",
"please input source dirent",
QMessageBox::Ok|QMessageBox::Cancel);
return;
}
insertItemComboBox(_srcDir, ui->comboSrcDir);
_destDir = ui->comboDestDir->currentText();
if(_destDir == "")
{
QMessageBox::information(this,
"information",
"please input destination dirent",
QMessageBox::Ok|QMessageBox::Cancel);
return;
}
insertItemComboBox(_destDir, ui->comboDestDir);
_targetDir = QDir(_destDir);
// 判断目标目录存不存在,如果目标目录不存在,则进行创建
if( !_targetDir.exists() )
{
if( !_targetDir.mkdir(_targetDir.absolutePath()) )
{
qDebug() << "mkdir error!";
return;
}
qDebug() << "targetDir.absolutePath(): " << _targetDir.absolutePath();
}
_totalFileCount = 0;
copy(_srcDir, _destDir, true);
list(_srcDir);
qDebug() << "_totalFileCount: " << _totalFileCount;
}
main.cpp
#include "Widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}