private static void CopyFileOrDirectory(Logger logger, string sourceDir, string root, string path) { // Root path not handled if (root.Length == 0) { throw new NotSupportedException(); } try { var zipFile = new ZipFile(sourceDir); foreach (var zipEntry in zipFile.GetAllEntries()) { var zipFilename = zipEntry.FilenameInZip; if (!zipFilename.StartsWith(root)) { continue; } // Get filename without leading "assets/data" var assetFilename = zipFilename.Substring(root.Length); var fullPath = path + assetFilename; var directoryName = VirtualFileSystem.GetParentFolder(fullPath); try { if (directoryName != string.Empty) { ApplicationData.CreateDirectory(directoryName); } } catch (IOException) { } using (var output = ApplicationData.OpenStream(fullPath, VirtualFileMode.Create, VirtualFileAccess.Write)) zipFile.ExtractFile(zipEntry, output); } } catch (IOException ex) { logger.Info("I/O Exception", ex); } }