1 #include "copymoveworker.h"
\r
2 #include "overwritedialog.h"
\r
9 const int SLEEP_TIME = 1;
\r
11 ///////////////////////////////////////////////////////////////////////////////
\r
12 /// \brief CopyMoveWorker::CopyMoveWorker
\r
16 CopyMoveWorker::CopyMoveWorker() :
\r
27 ///////////////////////////////////////////////////////////////////////////////
\r
28 /// \brief CopyMoveWorker::Listup
\r
29 /// \param srcPath コピー(移動)元パス
\r
30 /// \param tgtPath コピー(移動)先パス
\r
32 /// コピー(移動)対象をリストアップします。(再帰)
\r
34 void CopyMoveWorker::Listup(const QString &srcPath, const QString &tgtPath)
\r
39 this->thread()->msleep(SLEEP_TIME);
\r
41 QFileInfo info(srcPath);
\r
42 QDir tgtDir(tgtPath);
\r
44 m_CopyMap.insert(srcPath, tgtDir.absoluteFilePath(info.fileName()));
\r
45 if (!info.isDir()) {
\r
49 QDir srcDir(srcPath);
\r
50 QFileInfoList list = srcDir.entryInfoList(QDir::NoDotAndDotDot |
\r
56 foreach (QFileInfo info2, list) {
\r
57 Listup(info2.absoluteFilePath(),
\r
58 tgtDir.absoluteFilePath(info.fileName()));
\r
62 ///////////////////////////////////////////////////////////////////////////////
\r
63 /// \brief CopyMoveWorker::run
\r
67 void CopyMoveWorker::run()
\r
69 foreach (const QString &path, m_CopyList) {
\r
71 emit finished(true);
\r
74 Listup(path, m_tgtDir);
\r
78 int successCount = 0;
\r
81 int errDelCount = 0;
\r
82 const QString operation = (m_Move) ? tr("移動:%1 -> %2") :
\r
87 StringMap::iterator it;
\r
88 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
89 this->thread()->msleep(SLEEP_TIME);
\r
91 emit finished(true);
\r
94 QFileInfo srcInfo(it.key());
\r
95 QFileInfo tgtInfo(it.value());
\r
97 emit progress(operation
\r
98 .arg(srcInfo.absoluteFilePath())
\r
99 .arg(tgtInfo.absoluteFilePath()));
\r
101 if (srcInfo.isDir()) {
\r
102 if (tgtInfo.exists()) {
\r
103 emit success(tr("すでに存在"));
\r
105 else if (QDir().mkdir(it.value())) {
\r
106 emit success("フォルダ作成");
\r
109 emit error("フォルダの作成に失敗");
\r
114 do { // コピーをスキップするのにbreakを使うがためのdo-while
\r
115 if (tgtInfo.exists()) {
\r
118 emit askOverWrite(©Method,
\r
120 srcInfo.absoluteFilePath(),
\r
121 tgtInfo.absoluteFilePath());
\r
123 while (isAsking()) {
\r
124 thread()->msleep(100);
\r
129 msg = tr("%1個のファイルをコピーしました。").arg(successCount);
\r
130 if (skipCount > 0) {
\r
131 msg += tr("%1個のファイルをスキップしました。").arg(skipCount);
\r
133 if (errorCount > 0) {
\r
134 msg += tr("%1個のファイルをコピーできませんでした。").arg(errorCount);
\r
136 emit progress(msg);
\r
137 emit finished(true);
\r
141 if (copyMethod == "rbOverWrite") {
\r
142 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
143 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
147 QFile(tgtInfo.absoluteFilePath()).remove();
\r
149 else if (copyMethod == "rbOverWriteIfNew") {
\r
150 if (srcInfo.lastModified() <= tgtInfo.lastModified()) {
\r
151 emit success(tr("古いファイルのためスキップ"));
\r
155 if (srcInfo.absoluteFilePath() == tgtInfo.absoluteFilePath()) {
\r
156 emit success(tr("同一ファイルへの操作のためスキップ"));
\r
160 QFile(tgtInfo.absoluteFilePath()).remove();
\r
162 else if (copyMethod == "rbAppendNumber") {
\r
163 QString baseName = tgtInfo.baseName();
\r
164 QString suffix = tgtInfo.completeSuffix();
\r
165 for (int n = 1; ; n++) {
\r
166 QString newName = baseName + tr("%1.").arg(n) + suffix;
\r
167 tgtInfo.setFile(tgtInfo.absolutePath(), newName);
\r
168 if (!tgtInfo.exists()) {
\r
172 emit progress(tr("=> %1 にリネーム").arg(tgtInfo.fileName()));
\r
174 else if (copyMethod == "rbSkip") {
\r
175 emit success(tr("スキップ"));
\r
179 else if (copyMethod == "rbRename") {
\r
180 tgtInfo.setFile(tgtInfo.absolutePath(), alias);
\r
181 emit progress(tr("=> %1 にリネーム").arg(tgtInfo.fileName()));
\r
184 qDebug() << "Unknown method : " << copyMethod;
\r
189 ret = QFile::copy(srcInfo.absoluteFilePath(), tgtInfo.absoluteFilePath());
\r
192 emit success(tr("成功"));
\r
193 if (m_Move && srcInfo.absoluteFilePath() != tgtInfo.absoluteFilePath()) {
\r
194 ret = QFile(srcInfo.absoluteFilePath()).remove();
\r
197 emit error("元ファイルの削除に失敗");
\r
203 emit error(tr("失敗"));
\r
207 msg = tr("%1ファイル成功。").arg(successCount);
\r
208 if (skipCount > 0) {
\r
209 msg += tr("%1ファイルスキップ。").arg(skipCount);
\r
211 if (errorCount > 0) {
\r
212 msg += tr("%1ファイル失敗。").arg(errorCount);
\r
214 if (errDelCount > 0) {
\r
215 msg += tr("%1ファイル削除失敗。").arg(errDelCount);
\r
217 emit information(msg);
\r
222 for (it = m_CopyMap.begin(); it != m_CopyMap.end(); it++) {
\r
223 if (QFileInfo(it.key()).isDir()) {
\r
224 QDir().rmpath(it.key());
\r
232 ///////////////////////////////////////////////////////////////////////////////
\r
233 /// \brief CopyMoveWorker::initialText
\r
234 /// \return 初期表示テキストを返します。
\r
236 QString CopyMoveWorker::initialText() const
\r
239 return tr("移動準備中...");
\r
242 return tr("コピー準備中...");
\r