Remove-on-destroy option for simgear::Dir, to help with cleaning up temporary directories.

This commit is contained in:
James Turner 2011-10-21 09:36:10 +01:00
parent 63a8209a83
commit 43e13f0cf2
2 changed files with 29 additions and 5 deletions

View File

@ -47,22 +47,37 @@ using std::string;
namespace simgear namespace simgear
{ {
Dir::Dir() Dir::Dir() :
_removeOnDestroy(false)
{ {
} }
Dir::Dir(const SGPath& path) : Dir::Dir(const SGPath& path) :
_path(path) _path(path),
_removeOnDestroy(false)
{ {
_path.set_cached(false); // disable caching, so create/remove work _path.set_cached(false); // disable caching, so create/remove work
} }
Dir::Dir(const Dir& rel, const SGPath& relPath) : Dir::Dir(const Dir& rel, const SGPath& relPath) :
_path(rel.file(relPath.str())) _path(rel.file(relPath.str())),
_removeOnDestroy(false)
{ {
_path.set_cached(false); // disable caching, so create/remove work _path.set_cached(false); // disable caching, so create/remove work
} }
Dir::~Dir()
{
if (_removeOnDestroy) {
remove(true);
}
}
void Dir::setRemoveOnDestroy()
{
_removeOnDestroy = true;
}
Dir Dir::current() Dir Dir::current()
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -79,7 +94,7 @@ Dir Dir::tempDir(const std::string& templ)
{ {
#ifdef HAVE_MKDTEMP #ifdef HAVE_MKDTEMP
char buf[1024]; char buf[1024];
char* tempPath = ::getenv("TMPDIR"); const char* tempPath = ::getenv("TMPDIR");
if (!tempPath) { if (!tempPath) {
tempPath = "/tmp/"; tempPath = "/tmp/";
} }

View File

@ -43,7 +43,15 @@ namespace simgear
{ {
public: public:
Dir(); Dir();
~Dir();
/**
* when this directory object is destroyed, remove the corresponding
* diretory (and its contents) from the disk. Often used with temporary
* directories to ensure they are cleaned up.
*/
void setRemoveOnDestroy();
static Dir current(); static Dir current();
/** /**
@ -93,6 +101,7 @@ namespace simgear
Dir parent() const; Dir parent() const;
private: private:
mutable SGPath _path; mutable SGPath _path;
bool _removeOnDestroy;
}; };
} // of namespace simgear } // of namespace simgear