diff --git a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs index afdf1cc4a042..8897564efbdc 100644 --- a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs +++ b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs @@ -28,26 +28,19 @@ public static partial class Win32Helper { public static async Task GetFileAssociationAsync(string filename, bool checkDesktopFirst = false) { - // Find UWP apps - async Task GetUwpAssoc() - { - var uwpApps = await Launcher.FindFileHandlersAsync(Path.GetExtension(filename)); - return uwpApps.Any() ? uwpApps[0].PackageFamilyName : null; - } - - // Find desktop apps - string? GetDesktopAssoc() - { - var lpResult = new StringBuilder(2048); - var hResult = Shell32.FindExecutable(filename, null, lpResult); - - return hResult.ToInt64() > 32 ? lpResult.ToString() : null; - } - if (checkDesktopFirst) - return GetDesktopAssoc() ?? await GetUwpAssoc(); + return GetDesktopFileAssociation(filename) ?? (await GetUwpFileAssociations(filename)).FirstOrDefault(); - return await GetUwpAssoc() ?? GetDesktopAssoc(); + return (await GetUwpFileAssociations(filename)).FirstOrDefault() ?? GetDesktopFileAssociation(filename); + } + + public static async Task> GetAllFileAssociationsAsync(string filename) + { + var uwpApps = await GetUwpFileAssociations(filename); + var desktopApp = GetDesktopFileAssociation(filename); + return desktopApp is not null + ? uwpApps.Append(desktopApp) + : uwpApps; } public static string ExtractStringFromDLL(string file, int number) @@ -1073,5 +1066,17 @@ public static bool GetWin32FindDataForPath(string targetPath, out Win32PInvoke.W return false; } + private static async Task> GetUwpFileAssociations(string filename) + { + var uwpApps = await Launcher.FindFileHandlersAsync(Path.GetExtension(filename)); + return uwpApps.Select(x => x.PackageFamilyName); + } + + private static string? GetDesktopFileAssociation(string filename) + { + var lpResult = new StringBuilder(2048); + var hResult = Shell32.FindExecutable(filename, null, lpResult); + return hResult.ToInt64() > 32 ? lpResult.ToString() : null; + } } } diff --git a/src/Files.App/Utils/Storage/StorageItems/ZipStorageFolder.cs b/src/Files.App/Utils/Storage/StorageItems/ZipStorageFolder.cs index 9c0c2d6677ca..8a715aac1249 100644 --- a/src/Files.App/Utils/Storage/StorageItems/ZipStorageFolder.cs +++ b/src/Files.App/Utils/Storage/StorageItems/ZipStorageFolder.cs @@ -98,14 +98,11 @@ public static async Task CheckDefaultZipApp(string filePath) { Func> queryFileAssoc = async () => { - var assoc = await Win32Helper.GetFileAssociationAsync(filePath); - if (assoc is not null) - { - return assoc == Package.Current.Id.FamilyName - || assoc.EndsWith("Files.App\\Files.exe", StringComparison.OrdinalIgnoreCase) - || assoc.Equals(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"), StringComparison.OrdinalIgnoreCase); - } - return true; + var associations = await Win32Helper.GetAllFileAssociationsAsync(filePath); + return associations.Any(assoc => + assoc == Package.Current.Id.FamilyName + || assoc.EndsWith("Files.App\\Files.exe", StringComparison.OrdinalIgnoreCase) + || assoc.Equals(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"), StringComparison.OrdinalIgnoreCase)); }; var ext = IO.Path.GetExtension(filePath)?.ToLowerInvariant(); return await defaultAppDict.GetAsync(ext, queryFileAssoc);