Skip to content

Commit 835ba6e

Browse files
authored
Code quality: Use FileExtensionHelpers more widely (#10846)
1 parent 76b2d89 commit 835ba6e

File tree

8 files changed

+80
-57
lines changed

8 files changed

+80
-57
lines changed

src/Files.App/Filesystem/ListedItem.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ public override string ToString()
405405
public bool IsFtpItem => this is FtpItem;
406406
public bool IsArchive => this is ZipItem;
407407
public bool IsAlternateStream => this is AlternateStreamItem;
408-
public virtual bool IsExecutable => new[] { ".exe", ".bat", ".cmd" }.Contains(Path.GetExtension(ItemPath), StringComparer.OrdinalIgnoreCase);
408+
public virtual bool IsExecutable => FileExtensionHelpers.IsExecutableFile(ItemPath);
409409
public bool IsPinned => App.SidebarPinnedController.Model.FavoriteItems.Contains(itemPath);
410410

411411
private BaseStorageFile itemFile;
@@ -523,7 +523,7 @@ public override string Name
523523
public bool RunAsAdmin { get; set; }
524524
public bool IsUrl { get; set; }
525525
public bool IsSymLink { get; set; }
526-
public override bool IsExecutable => string.Equals(Path.GetExtension(TargetPath), ".exe", StringComparison.OrdinalIgnoreCase);
526+
public override bool IsExecutable => FileExtensionHelpers.IsExecutableFile(TargetPath, true);
527527
}
528528

529529
public class ZipItem : ListedItem

src/Files.App/Helpers/ContextFlyoutItemHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,15 +758,15 @@ public static List<ContextMenuFlyoutItemViewModel> GetBaseItemMenuItems(BaseLayo
758758
Glyph = "\uE7EF",
759759
Command = commandsViewModel.RunAsAdminCommand,
760760
ShowInSearchPage = true,
761-
ShowItem = new string[]{".bat", ".exe", ".cmd" }.Contains(selectedItems.FirstOrDefault().FileExtension, StringComparer.OrdinalIgnoreCase)
761+
ShowItem = FileExtensionHelpers.IsExecutableFile(selectedItems.FirstOrDefault().FileExtension)
762762
},
763763
new ContextMenuFlyoutItemViewModel()
764764
{
765765
Text = "BaseLayoutContextFlyoutRunAsAnotherUser/Text".GetLocalizedResource(),
766766
Glyph = "\uE7EE",
767767
Command = commandsViewModel.RunAsAnotherUserCommand,
768768
ShowInSearchPage = true,
769-
ShowItem = new string[]{".bat", ".exe", ".cmd" }.Contains(selectedItems.FirstOrDefault().FileExtension, StringComparer.OrdinalIgnoreCase)
769+
ShowItem = FileExtensionHelpers.IsExecutableFile(selectedItems.FirstOrDefault().FileExtension)
770770
},
771771
new ContextMenuFlyoutItemViewModel()
772772
{

src/Files.App/Helpers/FileExtensionHelpers.cs

Lines changed: 66 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,28 @@ namespace Files.App.Helpers
55
{
66
public static class FileExtensionHelpers
77
{
8+
/// <summary>
9+
/// Check if the file extension matches one of the specified extensions.
10+
/// </summary>
11+
/// <param name="filePathToCheck">Path or name or extension of the file to check.</param>
12+
/// <param name="extensions">List of the extensions to check.</param>
13+
/// <returns><c>true</c> if the filePathToCheck has one of the specified extensions;
14+
/// otherwise, <c>false</c>.</returns>
15+
public static bool HasExtension(string? filePathToCheck, params string[] extensions)
16+
{
17+
if (string.IsNullOrWhiteSpace(filePathToCheck))
18+
return false;
19+
return extensions.Any(ext => filePathToCheck.EndsWith(ext, StringComparison.OrdinalIgnoreCase));
20+
}
21+
822
/// <summary>
923
/// Check if the file extension is an image file.
1024
/// </summary>
1125
/// <param name="fileExtensionToCheck">The file extension to check.</param>
1226
/// <returns><c>true</c> if the fileExtensionToCheck is an image;
1327
/// otherwise, <c>false</c>.</returns>
1428
public static bool IsImageFile(string? fileExtensionToCheck)
15-
{
16-
if (string.IsNullOrWhiteSpace(fileExtensionToCheck))
17-
return false;
18-
19-
return fileExtensionToCheck.Equals(".png", StringComparison.OrdinalIgnoreCase) ||
20-
fileExtensionToCheck.Equals(".jpg", StringComparison.OrdinalIgnoreCase) ||
21-
fileExtensionToCheck.Equals(".bmp", StringComparison.OrdinalIgnoreCase) ||
22-
fileExtensionToCheck.Equals(".jpeg", StringComparison.OrdinalIgnoreCase);
23-
}
29+
=> HasExtension(fileExtensionToCheck, ".png", ".bmp", ".jpg", ".jpeg");
2430

2531
/// <summary>
2632
/// Check if the file extension is a PowerShell script.
@@ -29,10 +35,7 @@ public static bool IsImageFile(string? fileExtensionToCheck)
2935
/// <returns><c>true</c> if the fileExtensionToCheck is a PowerShell script;
3036
/// otherwise, <c>false</c>.</returns>
3137
public static bool IsPowerShellFile(string fileExtensionToCheck)
32-
{
33-
return !string.IsNullOrEmpty(fileExtensionToCheck) &&
34-
fileExtensionToCheck.Equals(".ps1", StringComparison.OrdinalIgnoreCase);
35-
}
38+
=> HasExtension(fileExtensionToCheck, ".ps1");
3639

3740
/// <summary>
3841
/// Check if the file extension is a zip file.
@@ -41,13 +44,7 @@ public static bool IsPowerShellFile(string fileExtensionToCheck)
4144
/// <returns><c>true</c> if the fileExtensionToCheck is a zip bundle file;
4245
/// otherwise <c>false</c>.</returns>
4346
public static bool IsZipFile(string? fileExtensionToCheck)
44-
{
45-
if (string.IsNullOrWhiteSpace(fileExtensionToCheck))
46-
return false;
47-
48-
return new[] { ".zip", ".msix", ".appx", ".msixbundle", ".7z", ".rar", ".tar" }
49-
.Contains(fileExtensionToCheck, StringComparer.OrdinalIgnoreCase);
50-
}
47+
=> HasExtension(fileExtensionToCheck, ".zip", ".msix", ".appx", ".msixbundle", ".7z", ".rar", ".tar");
5148

5249
public static bool IsBrowsableZipFile(string? filePath, out string? ext)
5350
{
@@ -62,11 +59,14 @@ public static bool IsBrowsableZipFile(string? filePath, out string? ext)
6259
return ext is not null;
6360
}
6461

62+
/// <summary>
63+
/// Check if the file extension is a driver inf file.
64+
/// </summary>
65+
/// <param name="fileExtensionToCheck">The file extension to check.</param>
66+
/// <returns><c>true</c> if the fileExtensionToCheck is an inf file;
67+
/// otherwise <c>false</c>.</returns>
6568
public static bool IsInfFile(string? fileExtensionToCheck)
66-
{
67-
return !string.IsNullOrWhiteSpace(fileExtensionToCheck) &&
68-
fileExtensionToCheck.Equals(".inf", StringComparison.OrdinalIgnoreCase);
69-
}
69+
=> HasExtension(fileExtensionToCheck, ".inf");
7070

7171
/// <summary>
7272
/// Check if the file extension is a font file.
@@ -76,15 +76,7 @@ public static bool IsInfFile(string? fileExtensionToCheck)
7676
/// otherwise <c>false</c>.</returns>
7777
/// <remarks>Font file types are; fon, otf, ttc, ttf</remarks>
7878
public static bool IsFontFile(string? fileExtensionToCheck)
79-
{
80-
if (string.IsNullOrWhiteSpace(fileExtensionToCheck))
81-
return false;
82-
83-
return fileExtensionToCheck.Equals(".fon", StringComparison.OrdinalIgnoreCase) ||
84-
fileExtensionToCheck.Equals(".otf", StringComparison.OrdinalIgnoreCase) ||
85-
fileExtensionToCheck.Equals(".ttc", StringComparison.OrdinalIgnoreCase) ||
86-
fileExtensionToCheck.Equals(".ttf", StringComparison.OrdinalIgnoreCase);
87-
}
79+
=> HasExtension(fileExtensionToCheck, ".fon", ".otf", ".ttc", ".ttf");
8880

8981
/// <summary>
9082
/// Check if the file path is a shortcut file.
@@ -94,18 +86,50 @@ public static bool IsFontFile(string? fileExtensionToCheck)
9486
/// otherwise <c>false</c>.</returns>
9587
/// <remarks>Shortcut file type is .lnk</remarks>
9688
public static bool IsShortcutFile(string? filePathToCheck)
97-
{
98-
return !string.IsNullOrWhiteSpace(filePathToCheck) &&
99-
filePathToCheck.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase);
100-
}
89+
=> HasExtension(filePathToCheck, ".lnk");
10190

91+
/// <summary>
92+
/// Check if the file path is a web link file.
93+
/// </summary>
94+
/// <param name="filePathToCheck">The file path to check.</param>
95+
/// <returns><c>true</c> if the filePathToCheck is a web link file;
96+
/// otherwise <c>false</c>.</returns>
97+
/// <remarks>Web link file type is .url</remarks>
10298
public static bool IsWebLinkFile(string? filePathToCheck)
103-
{
104-
return !string.IsNullOrWhiteSpace(filePathToCheck) &&
105-
filePathToCheck.EndsWith(".url", StringComparison.OrdinalIgnoreCase);
106-
}
99+
=> HasExtension(filePathToCheck, ".url");
107100

108101
public static bool IsShortcutOrUrlFile(string? filePathToCheck)
109-
=> IsShortcutFile(filePathToCheck) || IsWebLinkFile(filePathToCheck);
102+
=> HasExtension(filePathToCheck, ".lnk", ".url");
103+
104+
/// <summary>
105+
/// Check if the file path is an executable file.
106+
/// </summary>
107+
/// <param name="filePathToCheck">The file path to check.</param>
108+
/// <returns><c>true</c> if the filePathToCheck is an executable file;
109+
/// otherwise <c>false</c>.</returns>
110+
/// /// <remarks>Executable file types are; exe, bat, cmd</remarks>
111+
public static bool IsExecutableFile(string? filePathToCheck, bool exeOnly = false)
112+
=> exeOnly ?
113+
HasExtension(filePathToCheck, ".exe") :
114+
HasExtension(filePathToCheck, ".exe", ".bat", ".cmd");
115+
116+
/// <summary>
117+
/// Check if the file path is an msi installer file.
118+
/// </summary>
119+
/// <param name="filePathToCheck">The file path to check.</param>
120+
/// <returns><c>true</c> if the filePathToCheck is an msi installer file;
121+
/// otherwise <c>false</c>.</returns>
122+
public static bool IsMsiFile(string? filePathToCheck)
123+
=> HasExtension(filePathToCheck, ".msi");
124+
125+
/// <summary>
126+
/// Check if the file extension is a vhd disk file.
127+
/// </summary>
128+
/// <param name="fileExtensionToCheck">The file extension to check.</param>
129+
/// <returns><c>true</c> if the fileExtensionToCheck is a vhd disk file;
130+
/// otherwise <c>false</c>.</returns>
131+
/// <remarks>Vhd disk file types are; vhd, vhdx</remarks>
132+
public static bool IsVhdFile(string? fileExtensionToCheck)
133+
=> HasExtension(fileExtensionToCheck, ".vhd", ".vhdx");
110134
}
111135
}

src/Files.App/Helpers/ShellContextMenuHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ async void InvokeShellMenuItem(ContextMenu contextMenu, object? tag)
167167
if (tag is not Win32ContextMenuItem menuItem) return;
168168

169169
var menuId = menuItem.ID;
170-
var isFont = new[] { ".fon", ".otf", ".ttc", ".ttf" }.Contains(Path.GetExtension(contextMenu.ItemsPath[0]), StringComparer.OrdinalIgnoreCase);
170+
var isFont = FileExtensionHelpers.IsFontFile(contextMenu.ItemsPath[0]);
171171
var verb = menuItem.CommandString;
172172
switch (verb)
173173
{

src/Files.App/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ private static void Main()
7474
{
7575
if (tileArgs.Arguments is not null &&
7676
!tileArgs.Arguments.Contains($"files.exe", StringComparison.OrdinalIgnoreCase) &&
77-
new[] { ".exe", ".bat", ".cmd" }.Contains(Path.GetExtension(tileArgs.Arguments), StringComparer.OrdinalIgnoreCase))
77+
FileExtensionHelpers.IsExecutableFile(tileArgs.Arguments))
7878
{
7979
if (File.Exists(tileArgs.Arguments))
8080
{

src/Files.App/Shell/LaunchHelper.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
using Files.App.Helpers;
2+
using System;
23
using System.Collections;
34
using System.ComponentModel;
45
using System.Diagnostics;
@@ -34,7 +35,7 @@ private static async Task<bool> HandleApplicationLaunch(string application, stri
3435
{
3536
var currentWindows = Win32API.GetDesktopWindows();
3637

37-
if (new[] { ".vhd", ".vhdx" }.Contains(Path.GetExtension(application).ToLowerInvariant()))
38+
if (FileExtensionHelpers.IsVhdFile(application))
3839
{
3940
// Use powershell to mount vhds as this requires admin rights
4041
return Win32API.MountVhdDisk(application);
@@ -51,7 +52,7 @@ private static async Task<bool> HandleApplicationLaunch(string application, stri
5152
{
5253
process.StartInfo.UseShellExecute = true;
5354
process.StartInfo.Verb = "runas";
54-
if (string.Equals(Path.GetExtension(application), ".msi", StringComparison.OrdinalIgnoreCase))
55+
if (FileExtensionHelpers.IsMsiFile(application))
5556
{
5657
process.StartInfo.FileName = "msiexec.exe";
5758
process.StartInfo.Arguments = $"/a \"{application}\"";
@@ -61,7 +62,7 @@ private static async Task<bool> HandleApplicationLaunch(string application, stri
6162
{
6263
process.StartInfo.UseShellExecute = true;
6364
process.StartInfo.Verb = "runasuser";
64-
if (string.Equals(Path.GetExtension(application), ".msi", StringComparison.OrdinalIgnoreCase))
65+
if (FileExtensionHelpers.IsMsiFile(application))
6566
{
6667
process.StartInfo.FileName = "msiexec.exe";
6768
process.StartInfo.Arguments = $"/i \"{application}\"";

src/Files.App/ViewModels/Properties/FileProperties.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,8 @@ public override void GetBaseProperties()
5858

5959
var shortcutItem = (ShortcutItem)Item;
6060

61-
var isApplication = !string.IsNullOrWhiteSpace(shortcutItem.TargetPath) &&
62-
(shortcutItem.TargetPath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)
63-
|| shortcutItem.TargetPath.EndsWith(".msi", StringComparison.OrdinalIgnoreCase)
64-
|| shortcutItem.TargetPath.EndsWith(".bat", StringComparison.OrdinalIgnoreCase));
61+
var isApplication = FileExtensionHelpers.IsExecutableFile(shortcutItem.TargetPath) ||
62+
FileExtensionHelpers.IsMsiFile(shortcutItem.TargetPath);
6563

6664
ViewModel.ShortcutItemType = isApplication ? "Application".GetLocalizedResource() :
6765
Item.IsLinkItem ? "PropertiesShortcutTypeLink".GetLocalizedResource() : "PropertiesShortcutTypeFile".GetLocalizedResource();

src/Files.App/Views/Pages/Properties.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ protected override void OnNavigatedTo(NavigationEventArgs e)
6868
(listedItem.PrimaryItemAttribute == Windows.Storage.StorageItemTypes.Folder && !listedItem.IsArchive) ||
6969
(listedItem.IsShortcut && !listedItem.IsLinkItem)) ? Visibility.Visible : Visibility.Collapsed;
7070
TabCompatibility.Visibility = listedItem is not null && (
71-
".exe".Equals(listedItem is ShortcutItem sht ? System.IO.Path.GetExtension(sht.TargetPath) : listedItem.FileExtension, StringComparison.OrdinalIgnoreCase)
71+
FileExtensionHelpers.IsExecutableFile(listedItem is ShortcutItem sht ? sht.TargetPath : listedItem.FileExtension, true)
7272
) ? Visibility.Visible : Visibility.Collapsed;
7373
base.OnNavigatedTo(e);
7474
}

0 commit comments

Comments
 (0)