2017-08-10 3 views
1

QStringListという名前のfilesToCopyには、コピーするファイル名が含まれています。 私はこの出力を作りたい:QStringListをC++で操作する

%のために私が( "("、 "C:\ Users \ユーザーニーナ\ドキュメント\ A.mp4"、 「C:\ Users \ユーザーニーナ\ドキュメント\ A .SRT」、 "C:\ Users \ユーザーニーナ\ドキュメントは"、 "A.TXTを\)"、 は "%のI"、 "Cにコピーを実行します。\ユーザーは、" 自然科学研究機構\デスクトップ\ zを\)を

このように見えるように:%を

におけるI( "C:\ユーザーはニーナ\ドキュメント\ \ A.mp4" \ユーザー:」C "をC \ Users \ユーザーニーナ\ドキュメントはA.srtを\します" \ Nina \ Documents \ A.txt ")do コピー%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()を使用することができますconstの参照を反復処理したい場合は

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

:あなたは、C++標準の範囲ベースのループを使用する必要があります。