Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ public override async Task ExecuteAsync(object? parameter = null)
dialog.Password,
dialog.FileFormat,
dialog.CompressionLevel,
dialog.SplittingSize);
dialog.SplittingSize,
dialog.DictionarySize,
dialog.WordSize);

await StorageArchiveService.CompressAsync(compressionModel);
}
Expand Down
10 changes: 10 additions & 0 deletions src/Files.App/Data/Contracts/ICompressArchiveModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,16 @@ public interface ICompressArchiveModel
/// </summary>
ArchiveSplittingSizes SplittingSize { get; }

/// <summary>
/// 7zip archive dictionary size.
/// </summary>
ArchiveDictionarySizes DictionarySize { get; }

/// <summary>
/// 7zip archive word size (fast bytes).
/// </summary>
ArchiveWordSizes WordSize { get; }

/// <summary>
/// Number of CPU Threads to use.
/// </summary>
Expand Down
10 changes: 10 additions & 0 deletions src/Files.App/Data/Contracts/IGeneralSettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,16 @@ public interface IGeneralSettingsService : IBaseSettingsService, INotifyProperty
/// </summary>
ArchiveSplittingSizes ArchiveSplittingSizesOption { get; set; }

/// <summary>
/// Gets or sets a value indicating the default archive dictionary size for 7z.
/// </summary>
ArchiveDictionarySizes ArchiveDictionarySizesOption { get; set; }

/// <summary>
/// Gets or sets a value indicating the default archive word size for 7z.
/// </summary>
ArchiveWordSizes ArchiveWordSizesOption { get; set; }

/// <summary>
/// A dictionary to determine which hashes should be shown.
/// </summary>
Expand Down
81 changes: 81 additions & 0 deletions src/Files.App/Data/Enums/ArchiveDictionarySizes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Copyright (c) Files Community
// Licensed under the MIT License.

namespace Files.App.Data.Enums
{
/// <summary>
/// Defines constants that specify archive dictionary size for 7z LZMA/LZMA2.
/// </summary>
public enum ArchiveDictionarySizes
{
/// <summary>
/// Automatic (default based on compression level).
/// </summary>
Auto,

/// <summary>
/// 64 KB dictionary.
/// </summary>
Kb64,

/// <summary>
/// 256 KB dictionary.
/// </summary>
Kb256,

/// <summary>
/// 1 MB dictionary.
/// </summary>
Mb1,

/// <summary>
/// 2 MB dictionary.
/// </summary>
Mb2,

/// <summary>
/// 4 MB dictionary.
/// </summary>
Mb4,

/// <summary>
/// 8 MB dictionary.
/// </summary>
Mb8,

/// <summary>
/// 16 MB dictionary.
/// </summary>
Mb16,

/// <summary>
/// 32 MB dictionary.
/// </summary>
Mb32,

/// <summary>
/// 64 MB dictionary.
/// </summary>
Mb64,

/// <summary>
/// 128 MB dictionary.
/// </summary>
Mb128,

/// <summary>
/// 256 MB dictionary.
/// </summary>
Mb256,

/// <summary>
/// 512 MB dictionary.
/// </summary>
Mb512,

/// <summary>
/// 1024 MB dictionary.
/// </summary>
Mb1024,
}
}
51 changes: 51 additions & 0 deletions src/Files.App/Data/Enums/ArchiveWordSizes.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Copyright (c) Files Community
// Licensed under the MIT License.

namespace Files.App.Data.Enums
{
/// <summary>
/// Defines constants that specify archive word size (fast bytes) for 7z LZMA/LZMA2.
/// </summary>
public enum ArchiveWordSizes
{
/// <summary>
/// Automatic (default based on compression level).
/// </summary>
Auto,

/// <summary>
/// 8 fast bytes.
/// </summary>
Fb8,

/// <summary>
/// 16 fast bytes.
/// </summary>
Fb16,

/// <summary>
/// 32 fast bytes.
/// </summary>
Fb32,

/// <summary>
/// 64 fast bytes.
/// </summary>
Fb64,

/// <summary>
/// 128 fast bytes.
/// </summary>
Fb128,

/// <summary>
/// 256 fast bytes.
/// </summary>
Fb256,

/// <summary>
/// 273 fast bytes (maximum).
/// </summary>
Fb273,
}
}
55 changes: 54 additions & 1 deletion src/Files.App/Data/Models/CompressArchiveModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ public IProgress<StatusCenterItemProgressModel> Progress
/// <inheritdoc/>
public ArchiveSplittingSizes SplittingSize { get; init; }

/// <inheritdoc/>
public ArchiveDictionarySizes DictionarySize { get; init; }

/// <inheritdoc/>
public ArchiveWordSizes WordSize { get; init; }

/// <inheritdoc/>
public CancellationToken CancellationToken { get; set; }

Expand All @@ -120,7 +126,9 @@ public CompressArchiveModel(
string? password = null,
ArchiveFormats fileFormat = ArchiveFormats.Zip,
ArchiveCompressionLevels compressionLevel = ArchiveCompressionLevels.Normal,
ArchiveSplittingSizes splittingSize = ArchiveSplittingSizes.None)
ArchiveSplittingSizes splittingSize = ArchiveSplittingSizes.None,
ArchiveDictionarySizes dictionarySize = ArchiveDictionarySizes.Auto,
ArchiveWordSizes wordSize = ArchiveWordSizes.Auto)
{
_Progress = new Progress<StatusCenterItemProgressModel>();

Expand All @@ -132,6 +140,8 @@ public CompressArchiveModel(
FileFormat = fileFormat;
CompressionLevel = compressionLevel;
SplittingSize = splittingSize;
DictionarySize = dictionarySize;
WordSize = wordSize;
CPUThreads = cpuThreads;
}

Expand Down Expand Up @@ -165,6 +175,17 @@ public async Task<bool> RunCreationAsync()
if (FileFormat != ArchiveFormats.SevenZip)
compressor.CustomParameters.Add("cu", "on");

if (FileFormat is ArchiveFormats.SevenZip)
{
var dictParam = GetDictionarySizeParam();
if (dictParam is not null)
compressor.CustomParameters.Add("d", dictParam);

var wordParam = GetWordSizeParam();
if (wordParam is not null)
compressor.CustomParameters.Add("fb", wordParam);
}

compressor.Compressing += Compressor_Compressing;
compressor.FileCompressionStarted += Compressor_FileCompressionStarted;
compressor.FileCompressionFinished += Compressor_FileCompressionFinished;
Expand Down Expand Up @@ -268,5 +289,37 @@ private void Compressor_Compressing(object? _, ProgressEventArgs e)
if (_fileSystemProgress.TotalSize > 0)
_fileSystemProgress.Report((_fileSystemProgress.ProcessedSize + e.PercentDelta / 100.0 * e.BytesCount) / _fileSystemProgress.TotalSize * 100);
}

private string? GetDictionarySizeParam() => DictionarySize switch
{
ArchiveDictionarySizes.Auto => null,
ArchiveDictionarySizes.Kb64 => "64k",
ArchiveDictionarySizes.Kb256 => "256k",
ArchiveDictionarySizes.Mb1 => "1m",
ArchiveDictionarySizes.Mb2 => "2m",
ArchiveDictionarySizes.Mb4 => "4m",
ArchiveDictionarySizes.Mb8 => "8m",
ArchiveDictionarySizes.Mb16 => "16m",
ArchiveDictionarySizes.Mb32 => "32m",
ArchiveDictionarySizes.Mb64 => "64m",
ArchiveDictionarySizes.Mb128 => "128m",
ArchiveDictionarySizes.Mb256 => "256m",
ArchiveDictionarySizes.Mb512 => "512m",
ArchiveDictionarySizes.Mb1024 => "1024m",
_ => null,
};

private string? GetWordSizeParam() => WordSize switch
{
ArchiveWordSizes.Auto => null,
ArchiveWordSizes.Fb8 => "8",
ArchiveWordSizes.Fb16 => "16",
ArchiveWordSizes.Fb32 => "32",
ArchiveWordSizes.Fb64 => "64",
ArchiveWordSizes.Fb128 => "128",
ArchiveWordSizes.Fb256 => "256",
ArchiveWordSizes.Fb273 => "273",
_ => null,
};
}
}
Loading
Loading