Skip to content

Commit bd82384

Browse files
Feature: Use UTF-8 encoding for ZIP creation to ensure cross-language compatibility (#17026)
1 parent b15453e commit bd82384

File tree

3 files changed

+11
-0
lines changed

3 files changed

+11
-0
lines changed

src/Files.App/Data/Models/CompressArchiveModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ public async Task<bool> RunCreationAsync()
158158
};
159159

160160
compressor.CustomParameters.Add("mt", CPUThreads.ToString());
161+
//Use UTF-8 encoding.
162+
//References: 7-zip chm --> Command Line Version --> Switches
163+
//--> -m --> cu=[off | on].
164+
compressor.CustomParameters.Add("cu", "on");
161165

162166
compressor.Compressing += Compressor_Compressing;
163167
compressor.FileCompressionStarted += Compressor_FileCompressionStarted;

src/Files.App/Utils/Storage/StorageItems/ZipStorageFile.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ public override IAsyncAction RenameAsync(string desiredName, NameCollisionOption
326326
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
327327
{
328328
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
329+
compressor.CustomParameters.Add("cu", "on");
329330
compressor.SetFormatFromExistingArchive(archiveStream);
330331
var fileName = IO.Path.GetRelativePath(containerPath, IO.Path.Combine(IO.Path.GetDirectoryName(Path), desiredName));
331332
await compressor.ModifyArchiveAsync(archiveStream, new Dictionary<int, string>() { { index, fileName } }, Credentials.Password, ms);
@@ -375,6 +376,7 @@ public override IAsyncAction DeleteAsync(StorageDeleteOption option)
375376
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
376377
{
377378
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
379+
compressor.CustomParameters.Add("cu", "on");
378380
compressor.SetFormatFromExistingArchive(archiveStream);
379381
await compressor.ModifyArchiveAsync(archiveStream, new Dictionary<int, string>() { { index, null } }, Credentials.Password, ms);
380382
}

src/Files.App/Utils/Storage/StorageItems/ZipStorageFolder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ public override IAsyncOperation<BaseStorageFolder> CreateFolderAsync(string desi
315315
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
316316
{
317317
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
318+
compressor.CustomParameters.Add("cu", "on");
318319
compressor.SetFormatFromExistingArchive(archiveStream);
319320
var fileName = IO.Path.GetRelativePath(containerPath, zipDesiredName);
320321
await compressor.CompressStreamDictionaryAsync(archiveStream, new Dictionary<string, Stream>() { { fileName, null } }, Credentials.Password, ms);
@@ -366,6 +367,7 @@ public override IAsyncAction RenameAsync(string desiredName, NameCollisionOption
366367
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
367368
{
368369
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
370+
compressor.CustomParameters.Add("cu", "on");
369371
compressor.SetFormatFromExistingArchive(archiveStream);
370372
var folderKey = IO.Path.GetRelativePath(containerPath, Path);
371373
var folderDes = IO.Path.Combine(IO.Path.GetDirectoryName(folderKey), desiredName);
@@ -417,6 +419,7 @@ public override IAsyncAction DeleteAsync(StorageDeleteOption option)
417419
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
418420
{
419421
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
422+
compressor.CustomParameters.Add("cu", "on");
420423
compressor.SetFormatFromExistingArchive(archiveStream);
421424
var entriesMap = new Dictionary<int, string>(index.Select(x => new KeyValuePair<int, string>(x.Index, null)));
422425
await compressor.ModifyArchiveAsync(archiveStream, entriesMap, Credentials.Password, ms);
@@ -556,6 +559,7 @@ private static async Task<bool> InitArchive(Stream stream, OutArchiveFormat form
556559
CompressionMode = CompressionMode.Create,
557560
ArchiveFormat = format
558561
};
562+
compressor.CustomParameters.Add("cu", "on");
559563
await compressor.CompressStreamDictionaryAsync(stream, new Dictionary<string, Stream>());
560564
await stream.FlushAsync();
561565
return true;
@@ -627,6 +631,7 @@ public IAsyncOperation<BaseStorageFile> CreateFileAsync(Stream contents, string
627631
await using (var archiveStream = await OpenZipFileAsync(FileAccessMode.Read))
628632
{
629633
SevenZipCompressor compressor = new SevenZipCompressor() { CompressionMode = CompressionMode.Append };
634+
compressor.CustomParameters.Add("cu", "on");
630635
compressor.SetFormatFromExistingArchive(archiveStream);
631636
var fileName = IO.Path.GetRelativePath(containerPath, zipDesiredName);
632637
await compressor.CompressStreamDictionaryAsync(archiveStream, new Dictionary<string, Stream>() { { fileName, contents } }, Credentials.Password, ms);

0 commit comments

Comments
 (0)