2017-03-08 34 views
1

ドライブ上のファイルを別のファイルに置きたいと思います。研究をした後、私は「置き換える」方法がないことを発見した。代わりに、元のファイルを削除してから、一時ファイルをその場所に移動する必要があります。これを行うと、更新された一時ファイルが新しいディレクトリに移動することはありません。QT - ファイルを移動する方法

QTemporaryFile tempFile; 
if (tempFile.open()) 
{ 
    // Create temp file 
    QTextStream stream; 
    stream.setDevice(&tempFile); 
    document.save(stream, 4); // document is a QDomDocument object 
    tempFile.close(); 

    // Replace original file with temp file 
    file.remove(); 
    tempFile.rename("C:\\ProgramData\\Foo\\data.xml"); // I don't see the updated data.xml 
} 
+0

プログラムコードのパスが正しいことを確認してください。私は私のために働いたことを思い出します。 – AlexanderVX

+0

これは古典的なXY問題です。質問は別のものの文字通りの複製ですが、あなたはまったく名前を変更することに本当に気をつけません。あなたが探しているものは 'QSaveFile'です。書き込みが成功し、ファイルが置き換えられるか、または元のファイルが変更されずに保持されます。一時ファイルとアトミックマジックは、プラットフォームに依存しない方法で処理されます。 Win-win。 –

答えて

1

QTemporaryFileから問題が発生しているようです。

まず、tempFile.close();は何もしません。

bool QTemporaryFileEngine::close() 
{ 
    // Don't close the file, just seek to the front. 
    seek(0); 
    setError(QFile::UnspecifiedError, QString()); 
    return true; 
} 

第二に、あなたはtempFile.rename("C:\\ProgramData\\Foo\\data.xml");、 を呼び出したときに、それが効果的tempFileを閉じますが、それはまたtempFileオブジェクトが削除されるとき、それはあなたがコピーしたファイルを削除することを意味しているtempFile.fileName()を変更します:Qtのコードから に。これを防ぐには、tempFile.setAutoRemove(false)

あなたがしようとしているもののもう1つの解決策は、あなたに代わって "save to temp/close/replace"ルーチンを処理するQSaveFileを使用することです。

+0

QSaveFileは、それが正確には –

+0

のために作成されたユースケースであるので、 'QSaveFile'を推奨しました。' QSaveFile'は単なる「別の解決策」ではありません。それは*解決策ですが、より一般的な問題(データを破壊しない原子セーブの問題)を記述するのではなく、解決策を推測することによって尋ねられました。 –

関連する問題