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));
        }
Example #2
0
 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)));
     }
 }
Example #3
0
        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));
        }