Skip to content

Commit

Permalink
Fixed an issue where it didn't work to export settings (#9797)
Browse files Browse the repository at this point in the history
  • Loading branch information
gave92 committed Aug 23, 2022
1 parent 5aea8e4 commit ae93ded
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 21 deletions.
Binary file modified src/Files.Package/nupkgs/SevenZipSharp.1.0.0.nupkg
Binary file not shown.
51 changes: 46 additions & 5 deletions src/Files.Uwp/Filesystem/StorageItems/ZipStorageFolder.cs
Expand Up @@ -76,11 +76,11 @@ public static bool IsZipPath(string path, bool includeRoot = true)
public async Task<long> GetUncompressedSize()
{
long uncompressedSize = 0;
using (SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () =>
using SevenZipExtractor zipFile = await FilesystemTasks.Wrap(async () =>
{
var arch = await OpenZipFileAsync();
return arch?.ArchiveFileData is null ? null : arch; // Force load archive (1665013614u)
}))
});

if (zipFile != null)
{
Expand Down Expand Up @@ -179,18 +179,21 @@ public override IAsyncOperation<IStorageItem> GetItemAsync(string name)
return null;
}
//zipFile.IsStreamOwner = true;
var entry = zipFile.ArchiveFileData.FirstOrDefault(x => System.IO.Path.Combine(containerPath, x.FileName) == System.IO.Path.Combine(Path, name));
var filePath = System.IO.Path.Combine(Path, name);
var entry = zipFile.ArchiveFileData.FirstOrDefault(x => System.IO.Path.Combine(containerPath, x.FileName) == filePath);
if (entry.FileName is null)
{
return null;
}
if (entry.IsDirectory)
{
return new ZipStorageFolder(entry.FileName, containerPath, entry, backingFile);
return new ZipStorageFolder(filePath, containerPath, entry, backingFile);
}
return new ZipStorageFile(entry.FileName, containerPath, entry, backingFile);
return new ZipStorageFile(filePath, containerPath, entry, backingFile);
});
}
public override IAsyncOperation<IStorageItem> TryGetItemAsync(string name)
Expand Down Expand Up @@ -500,6 +503,44 @@ private static async Task<bool> CheckAccess(IStorageFile file)
});
}

public static Task<bool> InitArchive(string path, OutArchiveFormat format)
{
return SafetyExtensions.IgnoreExceptions(() =>
{
var hFile = NativeFileOperationsHelper.OpenFileForRead(path, true);
if (hFile.IsInvalid)
{
return Task.FromResult(false);
}
using var stream = new FileStream(hFile, FileAccess.ReadWrite);
return InitArchive(stream, format);
});
}
public static Task<bool> InitArchive(IStorageFile file, OutArchiveFormat format)
{
return SafetyExtensions.IgnoreExceptions(async () =>
{
using var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite);
using var stream = fileStream.AsStream();
return await InitArchive(stream, format);
});
}
private static async Task<bool> InitArchive(Stream stream, OutArchiveFormat format)
{
if (stream.Length == 0) // File is empty
{
var compressor = new SevenZipCompressor()
{
CompressionMode = CompressionMode.Create,
ArchiveFormat = format
};
await compressor.CompressStreamDictionaryAsync(stream, new Dictionary<string, Stream>());
await stream.FlushAsync();
return true;
}
return false;
}

private IAsyncOperation<SevenZipExtractor> OpenZipFileAsync()
{
return AsyncInfo.Run<SevenZipExtractor>(async (cancellationToken) =>
Expand Down
11 changes: 11 additions & 0 deletions src/Files.Uwp/Helpers/FileExtensionHelpers.cs
Expand Up @@ -48,12 +48,23 @@ public static bool IsPowerShellFile(string fileExtensionToCheck)
/// otherwise <c>false</c>.</returns>
public static bool IsZipFile(string fileExtensionToCheck)
{
if (string.IsNullOrEmpty(fileExtensionToCheck))
{
return false;
}

return new[] { ".zip", ".msix", ".appx", ".msixbundle", ".7z", ".rar", ".tar" }
.Contains(fileExtensionToCheck, StringComparer.OrdinalIgnoreCase);
}

public static bool IsBrowsableZipFile(string filePath, out string ext)
{
if (string.IsNullOrEmpty(filePath))
{
ext = null;
return false;
}

ext = new[] { ".zip", ".7z", ".rar", ".tar" } // Only ext we want to browse
.FirstOrDefault(x => filePath.Contains(x, StringComparison.OrdinalIgnoreCase));
return ext is not null;
Expand Down
30 changes: 14 additions & 16 deletions src/Files.Uwp/ViewModels/SettingsViewModels/AboutViewModel.cs
Expand Up @@ -18,6 +18,8 @@
using Windows.Storage.Pickers;
using Windows.System;
using Windows.UI.Xaml.Controls;
using System.Text;
using SevenZip;

namespace Files.Uwp.ViewModels.SettingsViewModels
{
Expand Down Expand Up @@ -59,37 +61,33 @@ private async Task ExportSettings()
{
try
{
var zipFolder = await ZipStorageFolder.FromStorageFileAsync(file);
await ZipStorageFolder.InitArchive(file, OutArchiveFormat.Zip);
var zipFolder = (ZipStorageFolder)await ZipStorageFolder.FromStorageFileAsync(file);
if (zipFolder == null)
{
return;
}
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
// Export user settings
var userSettings = await zipFolder.CreateFileAsync(Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
string exportSettings = (string)UserSettingsService.ExportSettings();
await userSettings.WriteTextAsync(exportSettings);
var exportSettings = UTF8Encoding.UTF8.GetBytes((string)UserSettingsService.ExportSettings());
await zipFolder.CreateFileAsync(new MemoryStream(exportSettings), Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
// Export bundles
var bundles = await zipFolder.CreateFileAsync(Constants.LocalSettings.BundlesSettingsFileName, CreationCollisionOption.ReplaceExisting);
string exportBundles = (string)BundlesSettingsService.ExportSettings();
await bundles.WriteTextAsync(exportBundles);
var exportBundles = UTF8Encoding.UTF8.GetBytes((string)BundlesSettingsService.ExportSettings());
await zipFolder.CreateFileAsync(new MemoryStream(exportBundles), Constants.LocalSettings.BundlesSettingsFileName, CreationCollisionOption.ReplaceExisting);
// Export pinned items
var pinnedItems = await BaseStorageFile.GetFileFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName, App.SidebarPinnedController.JsonFileName));
await pinnedItems.CopyAsync(zipFolder, pinnedItems.Name, NameCollisionOption.ReplaceExisting);
// Export terminals config
var terminals = await BaseStorageFile.GetFileFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName, App.TerminalController.JsonFileName));
await terminals.CopyAsync(zipFolder, terminals.Name, NameCollisionOption.ReplaceExisting);
// Export file tags list and DB
var fileTagsList = await zipFolder.CreateFileAsync(Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
string exportTags = (string)FileTagsSettingsService.ExportSettings();
await fileTagsList.WriteTextAsync(exportTags);
var fileTagsDB = await zipFolder.CreateFileAsync(Path.GetFileName(FileTagsHelper.FileTagsDbPath), CreationCollisionOption.ReplaceExisting);
string exportTagsDB = FileTagsHelper.DbInstance.Export();
await fileTagsDB.WriteTextAsync(exportTagsDB);
var exportTags = UTF8Encoding.UTF8.GetBytes((string)FileTagsSettingsService.ExportSettings());
await zipFolder.CreateFileAsync(new MemoryStream(exportTags), Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
var exportTagsDB = UTF8Encoding.UTF8.GetBytes(FileTagsHelper.DbInstance.Export());
await zipFolder.CreateFileAsync(new MemoryStream(exportTagsDB), Path.GetFileName(FileTagsHelper.FileTagsDbPath), CreationCollisionOption.ReplaceExisting);
// Export layout preferences DB
var layoutPrefsDB = await zipFolder.CreateFileAsync(Path.GetFileName(FolderSettingsViewModel.LayoutSettingsDbPath), CreationCollisionOption.ReplaceExisting);
string exportPrefsDB = FolderSettingsViewModel.DbInstance.Export();
await layoutPrefsDB.WriteTextAsync(exportPrefsDB);
var exportPrefsDB = UTF8Encoding.UTF8.GetBytes(FolderSettingsViewModel.DbInstance.Export());
await zipFolder.CreateFileAsync(new MemoryStream(exportPrefsDB), Path.GetFileName(FolderSettingsViewModel.LayoutSettingsDbPath), CreationCollisionOption.ReplaceExisting);
}
catch (Exception ex)
{
Expand Down

0 comments on commit ae93ded

Please sign in to comment.