From f032a36b603cf461c7a6ea9bfe89afe6442230c3 Mon Sep 17 00:00:00 2001 From: Marco Franzen Date: Fri, 1 Aug 2025 21:19:34 +0200 Subject: [PATCH 1/2] check all file associations --- .../Helpers/Win32/Win32Helper.Storage.cs | 41 +++++++++++-------- .../Storage/StorageItems/ZipStorageFolder.cs | 13 +++--- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs index 51bc82a35a73..9fd8370ce5c0 100644 --- a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs +++ b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs @@ -165,26 +165,19 @@ public static Task StartSTATask(Action action) 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) @@ -1210,5 +1203,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); From 11b054b83d949c9a031ce16bb5b5fe653d091a9a Mon Sep 17 00:00:00 2001 From: Marco Franzen Date: Fri, 8 Aug 2025 09:52:20 +0200 Subject: [PATCH 2/2] avoid async call if not needed --- src/Files.App/Helpers/Win32/Win32Helper.Storage.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs index 9fd8370ce5c0..c01d69f7a467 100644 --- a/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs +++ b/src/Files.App/Helpers/Win32/Win32Helper.Storage.cs @@ -166,7 +166,13 @@ public static Task StartSTATask(Action action) public static async Task GetFileAssociationAsync(string filename, bool checkDesktopFirst = false) { if (checkDesktopFirst) - return GetDesktopFileAssociation(filename) ?? (await GetUwpFileAssociations(filename)).FirstOrDefault(); + { + var desktopAssociation = GetDesktopFileAssociation(filename); + if (desktopAssociation is not null) + return desktopAssociation; + + return (await GetUwpFileAssociations(filename)).FirstOrDefault(); + } return (await GetUwpFileAssociations(filename)).FirstOrDefault() ?? GetDesktopFileAssociation(filename); }