Skip to content

Commit 4203f7f

Browse files
authored
Fix archive extraction (#9726)
* Handle invalid/psw archives (1665013614u) * Fix crash on extracting archives * Show archive info in preview pane * Call extract with entry index * Update SevenZipSharp * Update SevenZipSharp
1 parent 8887552 commit 4203f7f

File tree

5 files changed

+23
-14
lines changed

5 files changed

+23
-14
lines changed
-90 Bytes
Binary file not shown.

src/Files.Uwp/Filesystem/StorageItems/ZipStorageFile.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public override IAsyncOperation<IRandomAccessStream> OpenAsync(FileAccessMode ac
128128
if (entry.FileName is not null)
129129
{
130130
var ms = new MemoryStream();
131-
await zipFile.ExtractFileAsync(entry.FileName, ms);
131+
await zipFile.ExtractFileAsync(entry.Index, ms);
132132
ms.Position = 0;
133133
return new NonSeekableRandomAccessStreamForRead(ms, (ulong)entry.Size)
134134
{
@@ -178,7 +178,7 @@ public override IAsyncOperation<IRandomAccessStreamWithContentType> OpenReadAsyn
178178
}
179179

180180
var ms = new MemoryStream();
181-
await zipFile.ExtractFileAsync(entry.FileName, ms);
181+
await zipFile.ExtractFileAsync(entry.Index, ms);
182182
ms.Position = 0;
183183
var nsStream = new NonSeekableRandomAccessStreamForRead(ms, (ulong)entry.Size)
184184
{
@@ -221,7 +221,7 @@ public override IAsyncOperation<IInputStream> OpenSequentialReadAsync()
221221
}
222222

223223
var ms = new MemoryStream();
224-
await zipFile.ExtractFileAsync(entry.FileName, ms);
224+
await zipFile.ExtractFileAsync(entry.Index, ms);
225225
ms.Position = 0;
226226
return new NonSeekableRandomAccessStreamForRead(ms, (ulong)entry.Size)
227227
{
@@ -261,7 +261,7 @@ public override IAsyncOperation<BaseStorageFile> CopyAsync(IStorageFolder destin
261261
if (destFolder is ICreateFileWithStream cwsf)
262262
{
263263
var ms = new MemoryStream();
264-
await zipFile.ExtractFileAsync(entry.FileName, ms);
264+
await zipFile.ExtractFileAsync(entry.Index, ms);
265265
ms.Position = 0;
266266
using var inStream = new NonSeekableRandomAccessStreamForRead(ms, (ulong)entry.Size);
267267
return await cwsf.CreateFileAsync(inStream.AsStreamForRead(), desiredNewName, option.Convert());
@@ -270,7 +270,7 @@ public override IAsyncOperation<BaseStorageFile> CopyAsync(IStorageFolder destin
270270
{
271271
var destFile = await destFolder.CreateFileAsync(desiredNewName, option.Convert());
272272
using var outStream = await destFile.OpenStreamForWriteAsync();
273-
await zipFile.ExtractFileAsync(entry.FileName, outStream);
273+
await zipFile.ExtractFileAsync(entry.Index, outStream);
274274
return destFile;
275275
}
276276
});
@@ -294,7 +294,7 @@ public override IAsyncAction CopyAndReplaceAsync(IStorageFile fileToReplace)
294294
using var hDestFile = fileToReplace.CreateSafeFileHandle(FileAccess.ReadWrite);
295295
using (var outStream = new FileStream(hDestFile, FileAccess.Write))
296296
{
297-
await zipFile.ExtractFileAsync(entry.FileName, outStream);
297+
await zipFile.ExtractFileAsync(entry.Index, outStream);
298298
}
299299
});
300300
}
@@ -518,7 +518,7 @@ private StreamedFileDataRequestedHandler ZipDataStreamingHandler(string name)
518518
{
519519
using (var outStream = request.AsStreamForWrite())
520520
{
521-
await zipFile.ExtractFileAsync(entry.FileName, outStream);
521+
await zipFile.ExtractFileAsync(entry.Index, outStream);
522522
}
523523
request.Dispose();
524524
}

src/Files.Uwp/Helpers/ZipHelpers.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ public static class ZipHelpers
1313
{
1414
public static async Task ExtractArchive(BaseStorageFile archive, BaseStorageFolder destinationFolder, IProgress<float> progressDelegate, CancellationToken cancellationToken)
1515
{
16-
using (SevenZipExtractor zipFile = await Filesystem.FilesystemTasks.Wrap(async () => new SevenZipExtractor(await archive.OpenStreamForReadAsync())))
16+
using (SevenZipExtractor zipFile = await Filesystem.FilesystemTasks.Wrap(async () =>
1717
{
18-
if (zipFile == null || zipFile.ArchiveFileData == null)
18+
var arch = new SevenZipExtractor(await archive.OpenStreamForReadAsync());
19+
return arch?.ArchiveFileData is null ? null : arch; // Force load archive (1665013614u)
20+
}))
21+
{
22+
if (zipFile == null)
1923
{
2024
return;
2125
}
@@ -107,7 +111,7 @@ public static async Task ExtractArchive(BaseStorageFile archive, BaseStorageFold
107111
{
108112
try
109113
{
110-
await zipFile.ExtractFileAsync(entry.FileName, destinationStream);
114+
await zipFile.ExtractFileAsync(entry.Index, destinationStream);
111115
}
112116
catch (Exception ex)
113117
{

src/Files.Uwp/ViewModels/PreviewPaneViewModel.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Files.Shared.Cloud;
66
using Files.Shared.EventArguments;
77
using Files.Uwp.Filesystem;
8+
using Files.Uwp.Helpers;
89
using Files.Uwp.UserControls.FilePreviews;
910
using Files.Uwp.ViewModels.Previews;
1011
using System;
@@ -134,7 +135,7 @@ private async Task<UserControl> GetBuiltInPreviewControlAsync(ListedItem item, b
134135
return new BasicPreview(model);
135136
}
136137

137-
if (item.IsZipItem)
138+
if (FileExtensionHelpers.IsBrowsableZipFile(item.FileExtension, out _))
138139
{
139140
var model = new ArchivePreviewViewModel(item);
140141
await model.LoadAsync();

src/Files.Uwp/ViewModels/Previews/ArchivePreviewViewModel.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ namespace Files.Uwp.ViewModels.Previews
1111
{
1212
public class ArchivePreviewViewModel : BasePreviewModel
1313
{
14-
public ArchivePreviewViewModel(ListedItem item) : base(item) {}
14+
public ArchivePreviewViewModel(ListedItem item) : base(item) { }
1515

1616
public override async Task<List<FileProperty>> LoadPreviewAndDetailsAsync()
1717
{
1818
var details = new List<FileProperty>();
19-
using SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () => new SevenZipExtractor(await Item.ItemFile.OpenStreamForReadAsync()));
20-
if (zipFile == null || zipFile.ArchiveFileData == null)
19+
using SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () =>
20+
{
21+
var arch = new SevenZipExtractor(await Item.ItemFile.OpenStreamForReadAsync());
22+
return arch?.ArchiveFileData is null ? null : arch; // Force load archive (1665013614u)
23+
});
24+
if (zipFile == null)
2125
{
2226
_ = await base.LoadPreviewAndDetailsAsync(); // Loads the thumbnail preview
2327
return details;

0 commit comments

Comments
 (0)