protected override async Task <Action <AsyncCodeActivityContext> > ExecuteAsync(AsyncCodeActivityContext context, CancellationToken cancellationToken) { // Inputs var toCompress = ToCompress.Get(context); var zipFilePath = ZipFilePath.Get(context); if (toCompress is string) { toCompress = new string[] { toCompress.ToString() } } ; var paths = (IEnumerable <string>)toCompress; var directories = paths.Where(Directory.Exists); var files = paths.Except(directories) .Concat(directories.SelectMany(path => Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))) .Select(path => new FileInfo(path)) .Where(fi => fi.FullName != Path.GetFullPath(zipFilePath)); var mode = File.Exists(zipFilePath) ? ZipArchiveMode.Update : ZipArchiveMode.Create; var counter = 0; var allInRoot = files.Select(fi => fi.Directory.FullName).Distinct().Count() == 1; using (var zip = ZipFile.Open(zipFilePath, mode, Encoding)) { counter = CreateZip(files, allInRoot, zip, mode); } // Outputs return((ctx) => FilesCount.Set(ctx, counter)); }
protected override void CacheMetadata(CodeActivityMetadata metadata) { base.CacheMetadata(metadata); if (ToCompress == null) { metadata.AddValidationError(Resources.Validation_ValueErrorFormat(nameof(ToCompress))); } else if (ToCompress.IsArgumentTypeAnyCompatible <string, IEnumerable <string> >()) { metadata.AddRuntimeArgument(ToCompress, ToCompress.ArgumentType, nameof(ToCompress), true); } else { metadata.AddValidationError(Resources.Validation_TypeErrorFormat("IEnumerable<string> or IEnumerable<int>", nameof(ToCompress))); } }
protected override async Task <Action <AsyncCodeActivityContext> > ExecuteAsync(AsyncCodeActivityContext context, CancellationToken token) { var zipFilePath = Path.GetFullPath(ZipFilePath.Get(context)); var toCompress = ToCompress.Get(context); var encoding = TextEncoding.Get(context); var counter = 0; if (toCompress is string) { toCompress = new string[] { toCompress.ToString() } } ; await Task.Run(() => { var paths = (IEnumerable <string>)toCompress; var directories = paths.Where(Directory.Exists); var files = paths.Except(directories) .Concat(directories.SelectMany(path => Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))) .Select(Path.GetFullPath) .Where(path => path != zipFilePath); var emptyFolders = directories.SelectMany(dir => Directory.EnumerateDirectories(dir, "*", SearchOption.AllDirectories)) .Select(Path.GetFullPath) .Where(path => !Directory.EnumerateFileSystemEntries(path).Any()); var entries = files.Concat(emptyFolders).OrderBy(path => path).ToArray(); var mode = File.Exists(zipFilePath) ? ZipArchiveMode.Update : ZipArchiveMode.Create; using (var zip = ZipFile.Open(zipFilePath, mode, encoding)) counter = CompressTo(zip, entries, mode, token, null); }, token).ConfigureAwait(false); return(ctx => FilesCount.Set(ctx, counter)); }