1 #include "copymoveworker.h"
\r
2 #include "overwritedialog.h"
\r
9 CopyMoveWorker::CopyMoveWorker(QObject *parent) :
\r
10 AbstractWorker(parent),
\r
20 void CopyMoveWorker::operate()
\r
23 emit information(tr("移動準備中..."));
\r
26 emit information(tr("コピー準備中..."));
\r
29 foreach (const QFileInfo &info, *m_CopyList) {
\r
30 if (isStopRequested()) {
\r
34 Listup(info.absoluteFilePath(), m_tgtDir);
\r
38 int successCount = 0;
\r
41 int errDelCount = 0;
\r
45 StringMap::iterator it;
\r
46 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
47 if (isStopRequested()) {
\r
51 QFileInfo srcInfo(it.key());
\r
52 QFileInfo tgtInfo(it.value());
\r
54 emit operation((m_Move ? tr("移動") : tr("コピー:"))
\r
55 + srcInfo.absoluteFilePath()
\r
57 + tgtInfo.absoluteFilePath());
\r
59 if (srcInfo.isDir()) {
\r
60 if (tgtInfo.exists()) {
\r
61 emit success(tr("すでに存在"));
\r
63 else if (QDir().mkdir(it.value())) {
\r
64 emit success("フォルダ作成");
\r
67 emit error("フォルダの作成に失敗");
\r
72 do { // コピーをスキップするのにbreakを使うがためのdo-while
\r
73 if (tgtInfo.exists()) {
\r
76 emit askOverWrite(©Method,
\r
78 srcInfo.absoluteFilePath(),
\r
79 tgtInfo.absoluteFilePath());
\r
81 while (isAsking()) {
\r
82 thread()->msleep(100);
\r
86 if (isStopRequested()) {
\r
87 msg = tr("%1個のファイルをコピーしました。").arg(successCount);
\r
88 if (skipCount > 0) {
\r
89 msg += tr("%1個のファイルをスキップしました。").arg(skipCount);
\r
91 if (errorCount > 0) {
\r
92 msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);
\r
94 emit information(msg);
\r
99 if (copyMethod == "rbOverWrite") {
\r
100 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
101 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
105 QFile(tgtInfo.absoluteFilePath()).remove();
\r
107 else if (copyMethod == "rbOverWriteIfNew") {
\r
108 if (srcInfo.lastModified() <= tgtInfo.lastModified()) {
\r
109 emit success(tr("古いファイルのためスキップ"));
\r
113 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
114 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
118 QFile(tgtInfo.absoluteFilePath()).remove();
\r
120 else if (copyMethod == "rbAppendNumber") {
\r
121 QString baseName = tgtInfo.baseName();
\r
122 QString suffix = tgtInfo.completeSuffix();
\r
123 for (int n = 1; ; n++) {
\r
124 QString newName = baseName + tr("%1.").arg(n) + suffix;
\r
125 tgtInfo.setFile(tgtInfo.absolutePath(), newName);
\r
126 if (!tgtInfo.exists()) {
\r
130 emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));
\r
132 else if (copyMethod == "rbSkip") {
\r
133 emit success(tr("スキップ"));
\r
137 else if (copyMethod == "rbRename") {
\r
138 tgtInfo.setFile(tgtInfo.absolutePath(), alias);
\r
139 emit operation(tr("=>") + tgtInfo.fileName() + tr("にリネーム"));
\r
142 qDebug() << "Unknown method : " << copyMethod;
\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
161 emit error(tr("失敗"));
\r
165 msg = tr("%1ファイル成功。").arg(successCount);
\r
166 if (skipCount > 0) {
\r
167 msg += tr("%1ファイルスキップ。").arg(skipCount);
\r
169 if (errorCount > 0) {
\r
170 msg += tr("%1ファイル失敗。").arg(errorCount);
\r
172 if (errDelCount > 0) {
\r
173 msg += tr("%1ファイル削除失敗。").arg(errDelCount);
\r
175 emit information(msg);
\r
180 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
181 if (QFileInfo(it.key()).isDir()) {
\r
182 QDir().rmpath(it.key());
\r
190 void CopyMoveWorker::Listup(const QString &srcPath, const QString &tgtPath)
\r
192 if (isStopRequested()) {
\r
196 QFileInfo info(srcPath);
\r
197 QDir tgtDir(tgtPath);
\r
199 m_CopyMap.insert(srcPath, tgtDir.absoluteFilePath(info.fileName()));
\r
200 qDebug() << srcPath << " -> " << tgtDir.absoluteFilePath(info.fileName());
\r
201 if (info.isDir()) {
\r
202 QDir srcDir(srcPath);
\r
203 foreach (QFileInfo info2, srcDir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
\r
204 Listup(info2.absoluteFilePath(),
\r
205 tgtDir.absoluteFilePath(info.fileName()));
\r