diff --git a/dtool/src/dtoolutil/filename.cxx b/dtool/src/dtoolutil/filename.cxx index 319e5719e0..eb057abe01 100644 --- a/dtool/src/dtoolutil/filename.cxx +++ b/dtool/src/dtoolutil/filename.cxx @@ -1199,21 +1199,26 @@ open_read(ifstream &stream) const { // or set_binary(). //////////////////////////////////////////////////////////////////// bool Filename:: -open_write(ofstream &stream) const { +open_write(ofstream &stream, bool truncate) const { assert(is_text() || is_binary()); int open_mode = ios::out; + if (truncate) { + open_mode |= ios::trunc; + + } else { #ifdef WIN32_VC - // Windows insists on having this set to prevent the file from being - // truncated when we open it. Makes ios::trunc kind of pointless, - // doesn't it? On the other hand, setting ios::in also seems to - // imply ios::nocreate (!), so we should only set this if the file - // already exists. - if (exists()) { - open_mode |= ios::in; - } + // Windows insists on having ios::in set to prevent the file from + // being truncated when we open it. Makes ios::trunc kind of + // pointless, doesn't it? On the other hand, setting ios::in also + // seems to imply ios::nocreate (!), so we should only set this if + // the file already exists. + if (exists()) { + open_mode |= ios::in; + } #endif + } #ifdef HAVE_IOS_BINARY // For some reason, some systems (like Irix) don't define diff --git a/dtool/src/dtoolutil/filename.h b/dtool/src/dtoolutil/filename.h index bb53f206e3..0ca9cd3661 100644 --- a/dtool/src/dtoolutil/filename.h +++ b/dtool/src/dtoolutil/filename.h @@ -150,7 +150,7 @@ PUBLISHED: bool scan_directory(vector_string &contents) const; bool open_read(ifstream &stream) const; - bool open_write(ofstream &stream) const; + bool open_write(ofstream &stream, bool truncate = false) const; bool open_append(ofstream &stream) const; bool open_read_write(fstream &stream) const;