2017-08-10 63 views
1

我有一個名爲filesToCopyQStringList,它包含要複製的文件名。 我想使這個輸出:在C++中操作QStringList

用於%我在( 「(」, 「C:\用戶\尼娜\文檔\ A.mp4」, 「C:\用戶\尼娜\文件\ A污泥齡」, 「C:\用戶\尼娜\文檔\ A.TXT」, 「)」, 「不要複製%I」, 「C:\用戶\ NINS \桌面\ Z」)

看起來是這樣的:

用於%我在( 「C:\用戶\尼娜\文檔\ A.mp4」 「C:\用戶\尼娜\文檔\ A.srt」「C:\用戶\ Nina \ Documents \ A.txt「)做 副本%I 「C:\用戶\尼娜\桌面\ Z」

這是我的代碼:

d->copyProcess = new QProcess(this); 
QStringList copyProcessParameters; 
Q_FOREACH(QString fileName, fileNames) 
{ 
    d->totalFileSize += this->getSize(fileName); 
    d->filesToCopy.append(fileName); 
} 

d->filesToCopy.append(")"); 
d->filesToCopy.prepend("("); 
copyProcessParameters.append(d->filesToCopy); 
copyProcessParameters.append("do copy %I"); 
copyProcessParameters.append(destinationDir); 
copyProcessParameters.replaceInStrings("/","\\"); 
qDebug()<<"for %I in" << copyProcessParameters; 
d->copyProcess->start("for %I in", copyProcessParameters); 
+0

爲什麼要進行系統調用來複制文件?爲什麼不使用QFile來複制文件? – Mofi

+0

我不想使用線程和不使用線程QFileCopy同步工作,我不想。 @Mofi –

+0

你爲什麼不想使用線程?無論如何,外部過程實際上是另一個線程。這似乎是一個XY問題。你真正的目標是什麼? – RobbieE

回答

1

使用QStringList::join()創建由空格分隔的列表。

而且,爲了簡單起見,您可以使用QString::arg()或其重載來創建具有替換項的所需字符串。這將更直接地使用和可讀取,而不是大量的prepend()和/或append()調用。

下面是一個例子:

const QString format { R"(for %I in (%1) do copy %I %2)" }; 

const auto command = format.arg(filesList, destinationDir); 
0

正如@Azeem提到的,你可以使用join()方法:

auto l_files = fileNames.join(", "); 

還要注意的是宏觀Q_FOREACH目前(因爲Qt的5.7)氣餒,將被刪除在未來的Qt版本中。如果你想迭代常量引用您可以使用qAsConst()

for(auto& fileName : fileNames) 
{ 
    doSomething(fileName); 
} 

:應使用基於範圍的循環從C++標準。