annotate base/TempWriteFile.cpp @ 674:920e3880f7b4

* Add TempWriteFile abstraction, use it when exporting audio to avoid clobbering existing file before export is complete
author Chris Cannam
date Tue, 29 Mar 2011 17:30:23 +0100
parents
children 341e4e1a6ed3
rev   line source
Chris@674 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@674 2
Chris@674 3 /*
Chris@674 4 Sonic Visualiser
Chris@674 5 An audio file viewer and annotation editor.
Chris@674 6 Centre for Digital Music, Queen Mary, University of London.
Chris@674 7
Chris@674 8 This program is free software; you can redistribute it and/or
Chris@674 9 modify it under the terms of the GNU General Public License as
Chris@674 10 published by the Free Software Foundation; either version 2 of the
Chris@674 11 License, or (at your option) any later version. See the file
Chris@674 12 COPYING included with this distribution for more information.
Chris@674 13 */
Chris@674 14
Chris@674 15 #include "TempWriteFile.h"
Chris@674 16
Chris@674 17 #include "Exceptions.h"
Chris@674 18
Chris@674 19 #include <QTemporaryFile>
Chris@674 20 #include <QDir>
Chris@674 21 #include <iostream>
Chris@674 22
Chris@674 23 TempWriteFile::TempWriteFile(QString target) :
Chris@674 24 m_target(target)
Chris@674 25 {
Chris@674 26 QTemporaryFile temp(m_target + ".");
Chris@674 27 temp.setAutoRemove(false);
Chris@674 28 temp.open(); // creates the file and opens it atomically
Chris@674 29 if (temp.error()) {
Chris@674 30 std::cerr << "TempWriteFile: Failed to create temporary file in directory of " << m_target.toStdString() << ": " << temp.errorString().toStdString() << std::endl;
Chris@674 31 throw FileOperationFailed(temp.fileName(), "creation");
Chris@674 32 }
Chris@674 33
Chris@674 34 m_temp = temp.fileName();
Chris@674 35 temp.close();
Chris@674 36 }
Chris@674 37
Chris@674 38 TempWriteFile::~TempWriteFile()
Chris@674 39 {
Chris@674 40 if (m_temp != "") {
Chris@674 41 QDir dir(QFileInfo(m_temp).dir());
Chris@674 42 dir.remove(m_temp);
Chris@674 43 }
Chris@674 44 }
Chris@674 45
Chris@674 46 QString
Chris@674 47 TempWriteFile::getTemporaryFilename()
Chris@674 48 {
Chris@674 49 return m_temp;
Chris@674 50 }
Chris@674 51
Chris@674 52 void
Chris@674 53 TempWriteFile::moveToTarget()
Chris@674 54 {
Chris@674 55 if (m_temp == "") return;
Chris@674 56
Chris@674 57 QDir dir(QFileInfo(m_temp).dir());
Chris@674 58 // According to http://doc.trolltech.com/4.4/qdir.html#rename
Chris@674 59 // some systems fail, if renaming over an existing file.
Chris@674 60 // Therefore, delete first the existing file.
Chris@674 61 if (dir.exists(m_target)) dir.remove(m_target);
Chris@674 62 if (!dir.rename(m_temp, m_target)) {
Chris@674 63 std::cerr << "TempWriteFile: Failed to rename temporary file " << m_temp.toStdString() << " to target " << m_target.toStdString() << std::endl;
Chris@674 64 throw FileOperationFailed(m_temp, "rename");
Chris@674 65 }
Chris@674 66
Chris@674 67 m_temp = "";
Chris@674 68 }
Chris@674 69