diff options
-rw-r--r-- | backends/saves/default/default-saves.cpp | 2 | ||||
-rw-r--r-- | common/file.cpp | 20 | ||||
-rw-r--r-- | common/fs.cpp | 21 | ||||
-rw-r--r-- | common/fs.h | 8 |
4 files changed, 33 insertions, 18 deletions
diff --git a/backends/saves/default/default-saves.cpp b/backends/saves/default/default-saves.cpp index 17e888175c..ee54557a77 100644 --- a/backends/saves/default/default-saves.cpp +++ b/backends/saves/default/default-saves.cpp @@ -63,7 +63,7 @@ DefaultSaveFileManager::DefaultSaveFileManager(const Common::String &defaultSave void DefaultSaveFileManager::checkPath(const Common::FSNode &dir) { clearError(); if (!dir.exists()) { - if (!dir.createDirectory()) { + if (!dir.createDirectoryRecursive()) { setError(Common::kPathDoesNotExist, "Failed to create directory '"+dir.getPath()+"'"); } } else if (!dir.isDirectory()) { diff --git a/common/file.cpp b/common/file.cpp index 6228c6640b..12461b7382 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -155,24 +155,10 @@ bool DumpFile::open(const String &filename, bool createPath) { assert(!filename.empty()); assert(!_handle); - if (createPath) { - for (uint32 i = 0; i < filename.size(); ++i) { - if (filename[i] == '/' || filename[i] == '\\') { - Common::String subpath = filename; - subpath.erase(i); - if (subpath.empty()) continue; - AbstractFSNode *node = g_system->getFilesystemFactory()->makeFileNodePath(subpath); - if (node->exists()) { - delete node; - continue; - } - if (!node->createDirectory()) warning("DumpFile: unable to create directories from path prefix"); - delete node; - } - } - } - FSNode node(filename); + if (createPath) + node.getParent().createDirectoryRecursive(); + return open(node); } diff --git a/common/fs.cpp b/common/fs.cpp index d27de48370..2ba64099b4 100644 --- a/common/fs.cpp +++ b/common/fs.cpp @@ -168,6 +168,27 @@ bool FSNode::createDirectory() const { return _realNode->createDirectory(); } +bool FSNode::createDirectoryRecursive() const { + if (_realNode == nullptr) + return false; + + if (_realNode->exists()) { + if (!_realNode->isDirectory()) { + warning("FSNode::createDirectoryRecursive: '%s' is a file", _realNode->getName().c_str()); + return false; + } else { + return true; + } + } + + FSNode parent = getParent(); + assert(parent.getPath() != _realNode->getPath()); + if (!parent.createDirectoryRecursive()) + return false; + + return _realNode->createDirectory(); +} + FSDirectory::FSDirectory(const FSNode &node, int depth, bool flat) : _node(node), _cached(false), _depth(depth), _flat(flat) { } diff --git a/common/fs.h b/common/fs.h index 7041428fc8..e8c23f8486 100644 --- a/common/fs.h +++ b/common/fs.h @@ -239,6 +239,14 @@ public: * @return true if the directory was created, false otherwise. */ bool createDirectory() const; + + /** + * Creates a directory referred by this node. The parent directory + * will also be created if it doesn't exist. + * + * @return true if the directory was created, false otherwise. + */ + bool createDirectoryRecursive() const; }; /** |