2016-11-08 25 views
1

特定のディレクトリのファイルをスキャンするC++ \ Qtプログラムがあります。そこに含まれているファイルへのパスをテキストファイルに書き込もうとしていますが、最後にファイルへのパスを書き込むだけです。私は、テキストファイルにすべてのパスを書くことができますどのようにC++/Qtでテキストファイルに再帰的にデータを書き込む方法

void ScanDir::qDirIteratorScanner(QString path) 
{ 
    QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories); 
    while (it.hasNext()) 
    { 
     WriteToFile writeToFile(path, it.next()); 
     qDebug() << "it.next()"; 
    } 
} 

...

WriteToFile::WriteToFile(QString path, QString data) 
{ 
    path += "/Data.txt"; 
    QFile file(path); 

    if (file.open(QFile::ReadWrite)) { 
     QTextStream stream(&file); 
     stream << data << endl; 
    } 
} 

+0

タイトルは '再帰的' に言及が、コードではありません。 –

答えて

2

ファイルを開いて1行書き込むたびに、ファイル内にあるものを上書きします。代わりに、追加モードで開くようにしてください。これは、ファイルの最後に追加するものを作成する必要があります。

QTextStreamストリーム(&ファイル、QIODevice :: Append);

1

WriteToFile()ではなく、ファイルのオープンと書き込みをqDirIteratorScanner()に移動するのが最も効率的です。この方法で、ファイルを開き、すべてを書き込んだ後にファイルを閉じることができます。

これまでの作業では、すべての繰り返しで同じファイルを開いたまま(上書きする)ことができます。だからこそ、最後の書き込みだけが残っています。あるいは、QIODevice::Appendフラグを付けてファイルを開くこともできますが、これは最初の提案と比較して不必要な操作です。ファイルを一度しか開いておらず、すべてを書き込むことはできません。

4

WriteToFileの呼び出しごとに、読み取り/書き込みモードでQFileを作成しています。これはファイルの内容を切り捨てるため、最後の呼び出しで書き込まれた内容だけが残ります。

試してみてください。ここでは

void ScanDir::qDirIteratorScanner(QString path) 
{ 
    QDir dir(path); 

    QFile file(dir.absoluteFilePath("Data.txt")); 

    if (file.open(QFile::ReadWrite)) { 
     QTextStream stream(&file); 

     QDirIterator it(
      dir, 
      QStringList() << "*.mp4", 
      QDir::Files, 
      QDirIterator::Subdirectories 
     ); 
     while (it.hasNext()) 
     { 
      stream << it.next() << endl; 
     } 
    } 
} 

ファイルは一度だけ開かれます。 WriteToFileの機能を維持したい場合は、追加のパラメータとしてstreamを渡します(参照によって)。

注:

コメントでサイモン・クレーマーによって提案されたとして、それはそれは簡単にパスに欠落または偶発スラッシュを防止することができるように、私はQDir::absoluteFilePathを使用。

void ScanDir::qDirIteratorScanner(QString path) 
{ 
    QDir dir(path); 

    // reset the file 
    { 
     QFile file(dir.absoluteFilePath("Data.txt")); 

     file.open(QFile::ReadWrite); 
    } 

    QDirIterator it(
     dir, 
     QStringList() << "*.mp4", 
     QDir::Files, 
     QDirIterator::Subdirectories 
    ); 
    while (it.hasNext()) 
    { 
     WriteToFile writeToFile(path, it.next()); 
     qDebug() << "it.next()"; 
    } 
} 

WriteToFile::WriteToFile(QString path, QString data) 
{ 
    QDir dir(path); 

    QFile file(dir.absoluteFilePath("Data.txt")); 

    if (file.open(QFile::Append)) { 
     QTextStream stream(&file); 
     stream << data << endl; 
    } 
} 
+0

最初の例では、最初に 'path'を変更し(' + = ')、後でiteratorに使用します。 2番目の例の 'QFile file(path +" Data.txt ");' – Hayt

+0

のようにコピーしてください。コピー/ペーストの地獄です。 Thx :) – wasthishelpful

+0

私は 'QDir :: absoluteFilePath'のファンです。パスに紛失や偶発的なスラッシュを防ぐのが簡単です。 –

2

あなたがそうでなければ、その内容は、ファイルを開くたびに上書きされます、「追記」モードでファイルを開く必要があります。


あなたのデザインを維持するための代替はQFile::Appendモードを使用することであってもよいです:あなたのコードへ

file.open(QFile::Append) 

2備考:

  • コンストラクタからファイルに書き込むことは疑わしいようです。なぜ関数を宣言しないのですか?
  • ファイルを1回だけ開いてみませんか?

    void ScanDir::qDirIteratorScanner(QString path) 
    { 
        QFile file(QDir(path).absoluteFilePath("Data.txt")); 
        if(file.open(QFile::WriteOnly)) 
        { 
         QTextStream stream(&file); 
         QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories); 
         while (it.hasNext()) 
         { 
          stream << it.next() << endl; 
          qDebug() << "it.next()"; 
         } 
        } 
    } 
    
+0

'QFile :: ReadWrite | QFile :: Append':' ReadWrite'は 'ReadOnly | WriteOnly'のエイリアスで、' WriteOnly'はファイルの内容を上書きします。 'QFile :: Append'と書くだけです。 [doc](http://doc.qt.io/qt-5/qiodevice.html#OpenModeFlag-enum) – wasthishelpful

+0

@wasthishelpful Changed、thanksありがとうございます。私は最初にあなたのコメントを誤解しました。 –

関連する問題