Skip to content

Commit fdc81d8

Browse files
authored
Fix: Fixed an issue where import/export settings didn't work (#15471)
1 parent 8ede38f commit fdc81d8

File tree

1 file changed

+73
-66
lines changed

1 file changed

+73
-66
lines changed

src/Files.App/ViewModels/Settings/AdvancedViewModel.cs

Lines changed: 73 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -159,47 +159,45 @@ private async Task SetAsOpenFileDialogAsync()
159159

160160
private async Task ImportSettingsAsync()
161161
{
162-
FileOpenPicker filePicker = InitializeWithWindow(new FileOpenPicker());
163-
filePicker.FileTypeFilter.Add(".zip");
162+
string[] extensions = ["ZipFileCapitalized".GetLocalizedResource(), "*.zip"];
163+
CommonDialogService.Open_FileOpenDialog(MainWindow.Instance.WindowHandle, false, extensions, Environment.SpecialFolder.Desktop, out var filePath);
164164

165-
StorageFile file = await filePicker.PickSingleFileAsync();
166-
if (file is not null)
165+
try
167166
{
168-
try
169-
{
170-
var zipFolder = await ZipStorageFolder.FromStorageFileAsync(file);
171-
if (zipFolder is null)
172-
return;
173-
174-
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
175-
var settingsFolder = await StorageFolder.GetFolderFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName));
176-
177-
// Import user settings
178-
var userSettingsFile = await zipFolder.GetFileAsync(Constants.LocalSettings.UserSettingsFileName);
179-
string importSettings = await userSettingsFile.ReadTextAsync();
180-
UserSettingsService.ImportSettings(importSettings);
181-
182-
// Import file tags list and DB
183-
var fileTagsList = await zipFolder.GetFileAsync(Constants.LocalSettings.FileTagSettingsFileName);
184-
string importTags = await fileTagsList.ReadTextAsync();
185-
fileTagsSettingsService.ImportSettings(importTags);
186-
var fileTagsDB = await zipFolder.GetFileAsync(Constants.LocalSettings.FileTagSettingsDatabaseFileName);
187-
string importTagsDB = await fileTagsDB.ReadTextAsync();
188-
var tagDbInstance = FileTagsHelper.GetDbInstance();
189-
tagDbInstance.Import(importTagsDB);
190-
191-
// Import layout preferences and DB
192-
var layoutPrefsDB = await zipFolder.GetFileAsync(Constants.LocalSettings.UserSettingsDatabaseFileName);
193-
string importPrefsDB = await layoutPrefsDB.ReadTextAsync();
194-
var layoutDbInstance = LayoutPreferencesManager.GetDatabaseManagerInstance();
195-
layoutDbInstance.Import(importPrefsDB);
196-
}
197-
catch (Exception ex)
198-
{
199-
App.Logger.LogWarning(ex, "Error importing settings");
200-
UIHelpers.CloseAllDialogs();
201-
await DialogDisplayHelper.ShowDialogAsync("SettingsImportErrorTitle".GetLocalizedResource(), "SettingsImportErrorDescription".GetLocalizedResource());
202-
}
167+
var file = await StorageHelpers.ToStorageItem<BaseStorageFile>(filePath);
168+
169+
var zipFolder = await ZipStorageFolder.FromStorageFileAsync(file);
170+
if (zipFolder is null)
171+
return;
172+
173+
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
174+
var settingsFolder = await StorageFolder.GetFolderFromPathAsync(Path.Combine(localFolderPath, Constants.LocalSettings.SettingsFolderName));
175+
176+
// Import user settings
177+
var userSettingsFile = await zipFolder.GetFileAsync(Constants.LocalSettings.UserSettingsFileName);
178+
string importSettings = await userSettingsFile.ReadTextAsync();
179+
UserSettingsService.ImportSettings(importSettings);
180+
181+
// Import file tags list and DB
182+
var fileTagsList = await zipFolder.GetFileAsync(Constants.LocalSettings.FileTagSettingsFileName);
183+
string importTags = await fileTagsList.ReadTextAsync();
184+
fileTagsSettingsService.ImportSettings(importTags);
185+
var fileTagsDB = await zipFolder.GetFileAsync(Constants.LocalSettings.FileTagSettingsDatabaseFileName);
186+
string importTagsDB = await fileTagsDB.ReadTextAsync();
187+
var tagDbInstance = FileTagsHelper.GetDbInstance();
188+
tagDbInstance.Import(importTagsDB);
189+
190+
// Import layout preferences and DB
191+
var layoutPrefsDB = await zipFolder.GetFileAsync(Constants.LocalSettings.UserSettingsDatabaseFileName);
192+
string importPrefsDB = await layoutPrefsDB.ReadTextAsync();
193+
var layoutDbInstance = LayoutPreferencesManager.GetDatabaseManagerInstance();
194+
layoutDbInstance.Import(importPrefsDB);
195+
}
196+
catch (Exception ex)
197+
{
198+
App.Logger.LogWarning(ex, "Error importing settings");
199+
UIHelpers.CloseAllDialogs();
200+
await DialogDisplayHelper.ShowDialogAsync("SettingsImportErrorTitle".GetLocalizedResource(), "SettingsImportErrorDescription".GetLocalizedResource());
203201
}
204202
}
205203

@@ -208,39 +206,48 @@ private async Task ExportSettingsAsync()
208206
string[] extensions = ["ZipFileCapitalized".GetLocalizedResource(), "*.zip" ];
209207
CommonDialogService.Open_FileSaveDialog(MainWindow.Instance.WindowHandle, false, extensions, Environment.SpecialFolder.Desktop, out var filePath);
210208

211-
var file = await StorageHelpers.ToStorageItem<StorageFile>(filePath);
212-
if (file is not null)
209+
try
213210
{
214-
try
215-
{
216-
await ZipStorageFolder.InitArchive(file, OutArchiveFormat.Zip);
211+
var handle = Win32PInvoke.CreateFileFromAppW(
212+
filePath,
213+
Win32PInvoke.GENERIC_READ | Win32PInvoke.GENERIC_WRITE,
214+
Win32PInvoke.FILE_SHARE_READ | Win32PInvoke.FILE_SHARE_WRITE,
215+
nint.Zero,
216+
Win32PInvoke.CREATE_NEW,
217+
0,
218+
nint.Zero);
217219

218-
var zipFolder = (ZipStorageFolder)await ZipStorageFolder.FromStorageFileAsync(file);
219-
if (zipFolder is null)
220-
return;
220+
Win32PInvoke.CloseHandle(handle);
221221

222-
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
222+
var file = await StorageHelpers.ToStorageItem<BaseStorageFile>(filePath);
223223

224-
// Export user settings
225-
var exportSettings = UTF8Encoding.UTF8.GetBytes((string)UserSettingsService.ExportSettings());
226-
await zipFolder.CreateFileAsync(new MemoryStream(exportSettings), Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
224+
await ZipStorageFolder.InitArchive(file, OutArchiveFormat.Zip);
227225

228-
// Export file tags list and DB
229-
var exportTags = UTF8Encoding.UTF8.GetBytes((string)fileTagsSettingsService.ExportSettings());
230-
await zipFolder.CreateFileAsync(new MemoryStream(exportTags), Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
231-
var tagDbInstance = FileTagsHelper.GetDbInstance();
232-
byte[] exportTagsDB = UTF8Encoding.UTF8.GetBytes(tagDbInstance.Export());
233-
await zipFolder.CreateFileAsync(new MemoryStream(exportTagsDB), Constants.LocalSettings.FileTagSettingsDatabaseFileName, CreationCollisionOption.ReplaceExisting);
226+
var zipFolder = (ZipStorageFolder)await ZipStorageFolder.FromStorageFileAsync(file);
227+
if (zipFolder is null)
228+
return;
234229

235-
// Export layout preferences DB
236-
var layoutDbInstance = LayoutPreferencesManager.GetDatabaseManagerInstance();
237-
byte[] exportPrefsDB = UTF8Encoding.UTF8.GetBytes(layoutDbInstance.Export());
238-
await zipFolder.CreateFileAsync(new MemoryStream(exportPrefsDB), Constants.LocalSettings.UserSettingsDatabaseFileName, CreationCollisionOption.ReplaceExisting);
239-
}
240-
catch (Exception ex)
241-
{
242-
App.Logger.LogWarning(ex, "Error exporting settings");
243-
}
230+
var localFolderPath = ApplicationData.Current.LocalFolder.Path;
231+
232+
// Export user settings
233+
var exportSettings = UTF8Encoding.UTF8.GetBytes((string)UserSettingsService.ExportSettings());
234+
await zipFolder.CreateFileAsync(new MemoryStream(exportSettings), Constants.LocalSettings.UserSettingsFileName, CreationCollisionOption.ReplaceExisting);
235+
236+
// Export file tags list and DB
237+
var exportTags = UTF8Encoding.UTF8.GetBytes((string)fileTagsSettingsService.ExportSettings());
238+
await zipFolder.CreateFileAsync(new MemoryStream(exportTags), Constants.LocalSettings.FileTagSettingsFileName, CreationCollisionOption.ReplaceExisting);
239+
var tagDbInstance = FileTagsHelper.GetDbInstance();
240+
byte[] exportTagsDB = UTF8Encoding.UTF8.GetBytes(tagDbInstance.Export());
241+
await zipFolder.CreateFileAsync(new MemoryStream(exportTagsDB), Constants.LocalSettings.FileTagSettingsDatabaseFileName, CreationCollisionOption.ReplaceExisting);
242+
243+
// Export layout preferences DB
244+
var layoutDbInstance = LayoutPreferencesManager.GetDatabaseManagerInstance();
245+
byte[] exportPrefsDB = UTF8Encoding.UTF8.GetBytes(layoutDbInstance.Export());
246+
await zipFolder.CreateFileAsync(new MemoryStream(exportPrefsDB), Constants.LocalSettings.UserSettingsDatabaseFileName, CreationCollisionOption.ReplaceExisting);
247+
}
248+
catch (Exception ex)
249+
{
250+
App.Logger.LogWarning(ex, "Error exporting settings");
244251
}
245252
}
246253

0 commit comments

Comments
 (0)