diff --git a/components/bsa/bsa_file.cpp b/components/bsa/bsa_file.cpp index 4dfaa8658d..129c2bf454 100644 --- a/components/bsa/bsa_file.cpp +++ b/components/bsa/bsa_file.cpp @@ -252,6 +252,9 @@ int BSAFile::getIndex(const char *str) const /// Open an archive file. void BSAFile::open(const std::string &file) { + if (mIsLoaded) + close(); + mFilename = file; if(boost::filesystem::exists(file)) readHeader(); @@ -259,16 +262,20 @@ void BSAFile::open(const std::string &file) { { boost::filesystem::fstream(mFilename, std::ios::binary | std::ios::out); } writeHeader(); + mIsLoaded = true; } } /// Close the archive, write the updated headers to the file void Bsa::BSAFile::close() { - if (!mHasChanged) - return; + if (mHasChanged) + writeHeader(); - writeHeader(); + mFiles.clear(); + mStringBuf.clear(); + mLookup.clear(); + mIsLoaded = false; } Files::IStreamPtr BSAFile::getFile(const char *file) @@ -290,6 +297,8 @@ Files::IStreamPtr BSAFile::getFile(const FileStruct *file) void Bsa::BSAFile::addFile(const std::string& filename, std::istream& file) { + if (!mIsLoaded) + fail("Unable to add file " + filename + " the archive is not opened"); namespace bfs = boost::filesystem; auto newStartOfDataBuffer = 12 + (12 + 8) * (mFiles.size() + 1) + mStringBuf.size() + filename.size() + 1;