Skip to content

Commit ae93ded

Browse files
authored
Fixed an issue where it didn't work to export settings (#9797)
1 parent 5aea8e4 commit ae93ded

File tree

4 files changed

+71
-21
lines changed

4 files changed

+71
-21
lines changed
275 Bytes
Binary file not shown.

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

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ public static bool IsZipPath(string path, bool includeRoot = true)
7676
public async Task<long> GetUncompressedSize()
7777
{
7878
long uncompressedSize = 0;
79-
using (SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () =>
79+
using SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () =>
8080
{
8181
var arch = await OpenZipFileAsync();
8282
return arch?.ArchiveFileData is null ? null : arch; // Force load archive (1665013614u)
83-
}))
83+
});
8484

8585
if (zipFile != null)
8686
{
@@ -179,18 +179,21 @@ public override IAsyncOperation<IStorageItem> GetItemAsync(string name)
179179
return null;
180180
}
181181
//zipFile.IsStreamOwner = true;
182-
var entry = zipFile.ArchiveFileData.FirstOrDefault(x => System.IO.Path.Combine(containerPath, x.FileName) == System.IO.Path.Combine(Path, name));
182+
183+
var filePath = System.IO.Path.Combine(Path, name);
184+
185+
var entry = zipFile.ArchiveFileData.FirstOrDefault(x => System.IO.Path.Combine(containerPath, x.FileName) == filePath);
183186
if (entry.FileName is null)
184187
{
185188
return null;
186189
}
187190

188191
if (entry.IsDirectory)
189192
{
190-
return new ZipStorageFolder(entry.FileName, containerPath, entry, backingFile);
193+
return new ZipStorageFolder(filePath, containerPath, entry, backingFile);
191194
}
192195

193-
return new ZipStorageFile(entry.FileName, containerPath, entry, backingFile);
196+
return new ZipStorageFile(filePath, containerPath, entry, backingFile);
194197
});
195198
}
196199
public override IAsyncOperation<IStorageItem> TryGetItemAsync(string name)
@@ -500,6 +503,44 @@ private static async Task<bool> CheckAccess(IStorageFile file)
500503
});
501504
}
502505

506+
public static Task<bool> InitArchive(string path, OutArchiveFormat format)
507+
{
508+
return SafetyExtensions.IgnoreExceptions(() =>
509+
{
510+
var hFile = NativeFileOperationsHelper.OpenFileForRead(path, true);
511+
if (hFile.IsInvalid)
512+
{
513+
return Task.FromResult(false);
514+
}
515+
using var stream = new FileStream(hFile, FileAccess.ReadWrite);
516+
return InitArchive(stream, format);
517+
});
518+
}
519+
public static Task<bool> InitArchive(IStorageFile file, OutArchiveFormat format)
520+
{
521+
return SafetyExtensions.IgnoreExceptions(async () =>
522+
{
523+
using var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite);
524+
using var stream = fileStream.AsStream();
525+
return await InitArchive(stream, format);
526+
});
527+
}
528+
private static async Task<bool> InitArchive(Stream stream, OutArchiveFormat format)
529+
{
530+
if (stream.Length == 0) // File is empty
531+
{
532+
var compressor = new SevenZipCompressor()
533+
{
534+
CompressionMode = CompressionMode.Create,
535+
ArchiveFormat = format
536+
};
537+
await compressor.CompressStreamDictionaryAsync(stream, new Dictionary<string, Stream>());
538+
await stream.FlushAsync();
539+
return true;
540+
}
541+
return false;
542+
}
543+
503544
private IAsyncOperation<SevenZipExtractor> OpenZipFileAsync()
504545
{
505546
return AsyncInfo.Run<SevenZipExtractor>(async (cancellationToken) =>

src/Files.Uwp/Helpers/FileExtensionHelpers.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,23 @@ public static bool IsPowerShellFile(string fileExtensionToCheck)
4848
/// otherwise <c>false</c>.</returns>
4949
public static bool IsZipFile(string fileExtensionToCheck)
5050
{
51+
if (string.IsNullOrEmpty(fileExtensionToCheck))
52+
{
53+
return false;
54+
}
55+
5156
return new[] { ".zip", ".msix", ".appx", ".msixbundle", ".7z", ".rar", ".tar" }
5257
.Contains(fileExtensionToCheck, StringComparer.OrdinalIgnoreCase);
5358
}
5459

5560
public static bool IsBrowsableZipFile(string filePath, out string ext)
5661
{
62+
if (string.IsNullOrEmpty(filePath))
63+
{
64+
ext = null;
65+
return false;
66+
}
67+
5768
ext = new[] { ".zip", ".7z", ".rar", ".tar" } // Only ext we want to browse
5869
.FirstOrDefault(x => filePath.Contains(x, StringComparison.OrdinalIgnoreCase));
5970
return ext is not null;

src/Files.Uwp/ViewModels/SettingsViewModels/AboutViewModel.cs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
using Windows.Storage.Pickers;
1919
using Windows.System;
2020
using Windows.UI.Xaml.Controls;
21+
using System.Text;
22+
using SevenZip;
2123

2224
namespace Files.Uwp.ViewModels.SettingsViewModels
2325
{
@@ -59,37 +61,33 @@ private async Task ExportSettings()
5961
{
6062
try
6163
{
62-
var zipFolder = await ZipStorageFolder.FromStorageFileAsync(file);
64+
await ZipStorageFolder.InitArchive(file, OutArchiveFormat.Zip);
65+
var zipFolder = (ZipStorageFolder)await ZipStorageFolder.FromStorageFileAsync(file);
6366
if (zipFolder == null)
6467
{
6568
return;
6669
}
6770
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
6871
// Export user settings
69-
var userSettings = await zipFolder.CreateFileAsync(Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
70-
string exportSettings = (string)UserSettingsService.ExportSettings();
71-
await userSettings.WriteTextAsync(exportSettings);
72+
var exportSettings = UTF8Encoding.UTF8.GetBytes((string)UserSettingsService.ExportSettings());
73+
await zipFolder.CreateFileAsync(new MemoryStream(exportSettings), Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
7274
// Export bundles
73-
var bundles = await zipFolder.CreateFileAsync(Constants.LocalSettings.BundlesSettingsFileName, CreationCollisionOption.ReplaceExisting);
74-
string exportBundles = (string)BundlesSettingsService.ExportSettings();
75-
await bundles.WriteTextAsync(exportBundles);
75+
var exportBundles = UTF8Encoding.UTF8.GetBytes((string)BundlesSettingsService.ExportSettings());
76+
await zipFolder.CreateFileAsync(new MemoryStream(exportBundles), Constants.LocalSettings.BundlesSettingsFileName, CreationCollisionOption.ReplaceExisting);
7677
// Export pinned items
7778
var pinnedItems = await BaseStorageFile.GetFileFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName, App.SidebarPinnedController.JsonFileName));
7879
await pinnedItems.CopyAsync(zipFolder, pinnedItems.Name, NameCollisionOption.ReplaceExisting);
7980
// Export terminals config
8081
var terminals = await BaseStorageFile.GetFileFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName, App.TerminalController.JsonFileName));
8182
await terminals.CopyAsync(zipFolder, terminals.Name, NameCollisionOption.ReplaceExisting);
8283
// Export file tags list and DB
83-
var fileTagsList = await zipFolder.CreateFileAsync(Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
84-
string exportTags = (string)FileTagsSettingsService.ExportSettings();
85-
await fileTagsList.WriteTextAsync(exportTags);
86-
var fileTagsDB = await zipFolder.CreateFileAsync(Path.GetFileName(FileTagsHelper.FileTagsDbPath), CreationCollisionOption.ReplaceExisting);
87-
string exportTagsDB = FileTagsHelper.DbInstance.Export();
88-
await fileTagsDB.WriteTextAsync(exportTagsDB);
84+
var exportTags = UTF8Encoding.UTF8.GetBytes((string)FileTagsSettingsService.ExportSettings());
85+
await zipFolder.CreateFileAsync(new MemoryStream(exportTags), Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
86+
var exportTagsDB = UTF8Encoding.UTF8.GetBytes(FileTagsHelper.DbInstance.Export());
87+
await zipFolder.CreateFileAsync(new MemoryStream(exportTagsDB), Path.GetFileName(FileTagsHelper.FileTagsDbPath), CreationCollisionOption.ReplaceExisting);
8988
// Export layout preferences DB
90-
var layoutPrefsDB = await zipFolder.CreateFileAsync(Path.GetFileName(FolderSettingsViewModel.LayoutSettingsDbPath), CreationCollisionOption.ReplaceExisting);
91-
string exportPrefsDB = FolderSettingsViewModel.DbInstance.Export();
92-
await layoutPrefsDB.WriteTextAsync(exportPrefsDB);
89+
var exportPrefsDB = UTF8Encoding.UTF8.GetBytes(FolderSettingsViewModel.DbInstance.Export());
90+
await zipFolder.CreateFileAsync(new MemoryStream(exportPrefsDB), Path.GetFileName(FolderSettingsViewModel.LayoutSettingsDbPath), CreationCollisionOption.ReplaceExisting);
9391
}
9492
catch (Exception ex)
9593
{

0 commit comments

Comments
 (0)