bool DeepCopyDirectory(const char* from, const char* to) { if (!from || !to) return false; DirectoryTree fromDir(from); if (!fromDir) return false; CreateDirectoryIfNotExists(to); DirectoryTree toDir(to); if (!toDir) return false; bool success(true); auto visitor = [to,&success](const DirectoryTree*, const DirectoryEntry& entry) { auto newPath = Aws::FileSystem::Join(to, entry.relativePath); if (entry.fileType == Aws::FileSystem::FileType::File) { Aws::OFStream copyOutStream(newPath.c_str()); Aws::IFStream originalStream(entry.path.c_str()); if(!copyOutStream.good() || !originalStream.good()) { success = false; return false; } std::copy(std::istreambuf_iterator<char>(originalStream), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(copyOutStream)); } else if (entry.fileType == Aws::FileSystem::FileType::Directory) { success = CreateDirectoryIfNotExists(newPath.c_str()); return success; } return success; }; fromDir.TraverseDepthFirst(visitor); return success; }
void DirUtils::EnsureDirectoryExists(const wstring& path) { wstring normalizedPath = DirUtils::NormalizePath(path); vector<wstring> pathParts = StringUtils::Split(normalizedPath, L'/'); vector<wstring>::iterator it; vector<wstring>::iterator itEnd = pathParts.end(); wstring tmpPath; for(it = pathParts.begin();it!=itEnd;it++) { wstring current = *it; tmpPath.append(current + L"/"); CreateDirectoryIfNotExists(tmpPath); } }