private void CreateZip(string path, string zipFileName, string ignore = null)
        {
            ZipFile zipFile = new ZipFile
                                  {
                                      CompressionLevel = CompressionLevel.BestCompression,
                                      UseZip64WhenSaving = Zip64Option.AsNecessary
                                  };

            if (ignore == null)
            {
                zipFile.AddDirectory(path);
            }
            else
            {
                Assert.IsTrue(
                    !ignore.Contains('\\') && !ignore.Contains('/'),
                    "Multi-level ignore is not supported for archiving",
                    true);

                foreach (string str in Directory.GetDirectories(path))
                {
                    string name = new DirectoryInfo(str).Name;

                    if (!name.EqualsIgnoreCase(ignore, false))
                    {
                        zipFile.AddDirectory(str, name);
                    }
                }

                foreach (string fileName in Directory.GetFiles(path))
                {
                    zipFile.AddFile(fileName, "/");
                }
            }

            zipFile.Save(zipFileName);
        }
    public virtual void DeleteIfExists([CanBeNull] string path, string ignore = null)
    {
      if (!string.IsNullOrEmpty(path) && (Directory.Exists(path) || File.Exists(path)))
      {
        if (ignore == null)
        {
          this.Delete(path);
        }
        else
        {
          Assert.IsTrue(!ignore.Contains('\\') && !ignore.Contains('/'), "Multi-level ignore is not supported for deleting");
          foreach (var directory in Directory.GetDirectories(path))
          {
            string directoryName = new DirectoryInfo(directory).Name;
            if (!directoryName.EqualsIgnoreCase(ignore))
            {
              this.Delete(directory);
            }
          }

          foreach (var file in Directory.GetFiles(path))
          {
            this.Delete(file);
          }
        }
      }
    }
    public virtual void CreateZip(string path, string zipFileName, string ignore = null, int compressionLevel = 0)
    {
      CompressionLevel zipCompressionLevel;
      if (typeof(CompressionLevel).IsEnumDefined(compressionLevel))
      {
        zipCompressionLevel = (CompressionLevel)compressionLevel;
      }
      else
      {
        zipCompressionLevel = CompressionLevel.None;
      }
      var zip = new ZipFile
      {
        CompressionLevel = zipCompressionLevel,
        UseZip64WhenSaving = Zip64Option.AsNecessary
      };
      if (ignore == null)
      {
        zip.AddDirectory(path); // , relativePath);
      }
      else
      {
        Assert.IsTrue(!ignore.Contains('\\') && !ignore.Contains('/'), "Multi-level ignore is not supported for archiving");
        foreach (var directory in Directory.GetDirectories(path))
        {
          string directoryName = new DirectoryInfo(directory).Name;
          if (!directoryName.EqualsIgnoreCase(ignore))
          {
            zip.AddDirectory(directory, directoryName);
          }
        }

        foreach (var file in Directory.GetFiles(path))
        {
          zip.AddFile(file, "/");
        }
      }

      // zip.SaveProgress += this.OnSaveProgress;
      zip.Save(zipFileName);
    }