1 #include "copymoveworker.h"
\r
2 #include "overwritedialog.h"
\r
9 CopyMoveWorker::CopyMoveWorker(QObject *parent) :
\r
20 void CopyMoveWorker::operate()
\r
23 m_progressText->setText(tr("移動準備中..."));
\r
26 m_progressText->setText(tr("コピー準備中..."));
\r
29 foreach (const QFileInfo &info, *m_CopyList) {
\r
30 if (isStopRequested()) {
\r
34 Listup(info.absoluteFilePath(), m_tgtDir);
\r
38 int copyMethod = OverWriteDialog::Undefined;
\r
39 int prevCopyMethod = OverWriteDialog::Undefined;
\r
40 int successCount = 0;
\r
43 int errDelCount = 0;
\r
46 StringMap::iterator it;
\r
47 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
48 if (isStopRequested()) {
\r
52 QFileInfo srcInfo(it.key());
\r
53 QFileInfo tgtInfo(it.value());
\r
55 emit operation((m_Move ? tr("移動") : tr("コピー:"))
\r
56 + srcInfo.absoluteFilePath()
\r
58 + tgtInfo.absoluteFilePath());
\r
60 if (srcInfo.isDir()) {
\r
61 if (tgtInfo.exists()) {
\r
62 emit success(tr("すでに存在"));
\r
64 else if (QDir().mkdir(it.value())) {
\r
65 emit success("フォルダ作成");
\r
68 emit error("フォルダの作成に失敗");
\r
73 do { // コピーをスキップするのにbreakを使うがためのdo-while
\r
74 if (tgtInfo.exists()) {
\r
76 if (copyMethod == OverWriteDialog::Undefined ||
\r
77 copyMethod == OverWriteDialog::Rename)
\r
81 emit askOverWrite(&bOk, &prevCopyMethod, ©Method, &alias,
\r
82 srcInfo.absoluteFilePath(),
\r
83 tgtInfo.absoluteFilePath());
\r
84 while (isAsking()) {
\r
85 this->thread()->msleep(100);
\r
90 msg = tr("%1個のファイルをコピーしました。").arg(successCount);
\r
91 if (skipCount > 0) {
\r
92 msg += tr("%1個のファイルをスキップしました。").arg(skipCount);
\r
94 if (errorCount > 0) {
\r
95 msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);
\r
97 m_progressText->setText(msg);
\r
103 if (prevCopyMethod == OverWriteDialog::OverWrite) {
\r
104 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
105 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
109 QFile(tgtInfo.absoluteFilePath()).remove();
\r
111 else if (prevCopyMethod == OverWriteDialog::OverWriteIfNew) {
\r
112 if (srcInfo.lastModified() <= tgtInfo.lastModified()) {
\r
113 emit success(tr("古いファイルのためスキップ"));
\r
117 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
118 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
122 QFile(tgtInfo.absoluteFilePath()).remove();
\r
124 else if (prevCopyMethod == OverWriteDialog::AppendNumber) {
\r
125 QString baseName = tgtInfo.baseName();
\r
126 QString suffix = tgtInfo.completeSuffix();
\r
127 for (int n = 1; ; n++) {
\r
128 QString newName = baseName + tr("%1.").arg(n) + suffix;
\r
129 tgtInfo.setFile(tgtInfo.absolutePath(), newName);
\r
130 if (!tgtInfo.exists()) {
\r
134 emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));
\r
136 else if (prevCopyMethod == OverWriteDialog::Skip) {
\r
137 emit success(tr("スキップ"));
\r
141 else if (prevCopyMethod == OverWriteDialog::Rename) {
\r
142 tgtInfo.setFile(tgtInfo.absolutePath(), alias);
\r
143 emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));
\r
147 ret = QFile::copy(srcInfo.absoluteFilePath(), tgtInfo.absoluteFilePath());
\r
150 emit success(tr("成功"));
\r
151 if (m_Move && srcInfo.absoluteFilePath() != tgtInfo.absoluteFilePath()) {
\r
152 ret = QFile(srcInfo.absoluteFilePath()).remove();
\r
155 emit error("元ファイルの削除に失敗");
\r
162 emit error(tr("失敗"));
\r
166 msg = tr("%1ファイル成功。").arg(successCount);
\r
167 if (skipCount > 0) {
\r
168 msg += tr("%1ファイルスキップ。").arg(skipCount);
\r
170 if (errorCount > 0) {
\r
171 msg += tr("%1ファイル失敗。").arg(errorCount);
\r
173 if (errDelCount > 0) {
\r
174 msg += tr("%1ファイル削除失敗。").arg(errDelCount);
\r
176 m_progressText->setText(msg);
\r
181 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
182 if (QFileInfo(it.key()).isDir()) {
\r
183 QDir().rmpath(it.key());
\r
191 void CopyMoveWorker::Listup(const QString &srcPath, const QString &tgtPath)
\r
193 if (isStopRequested()) {
\r
197 QFileInfo info(srcPath);
\r
198 QDir tgtDir(tgtPath);
\r
200 m_CopyMap.insert(srcPath, tgtDir.absoluteFilePath(info.fileName()));
\r
201 qDebug() << srcPath << " -> " << tgtDir.absoluteFilePath(info.fileName());
\r
202 if (info.isDir()) {
\r
203 QDir srcDir(srcPath);
\r
204 foreach (QFileInfo info2, srcDir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
\r
205 Listup(info2.absoluteFilePath(),
\r
206 tgtDir.absoluteFilePath(info.fileName()));
\r