Skip to content

Commit 9ab8690

Browse files
authored
Codebase quality: Use helper method for checking .lnk and .url extensions (#10772)
1 parent 841aefb commit 9ab8690

13 files changed

+47
-36
lines changed

src/Files.App/Filesystem/FilesystemOperations/FilesystemOperations.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ await associatedInstance.FilesystemViewModel.GetFileFromPathAsync(iFilePath)
549549
IEnumerable<ShellFileItem> nameMatchItems, items = await recycleBinHelpers.EnumerateRecycleBin();
550550

551551
// Get name matching files
552-
if (Path.GetExtension(source.Path) == ".lnk" || Path.GetExtension(source.Path) == ".url") // We need to check if it is a shortcut file
552+
if (FileExtensionHelpers.IsShortcutOrUrlFile(source.Path)) // We need to check if it is a shortcut file
553553
{
554554
nameMatchItems = items.Where((item) => item.FilePath == Path.Combine(Path.GetDirectoryName(source.Path), Path.GetFileNameWithoutExtension(source.Path)));
555555
}

src/Files.App/Filesystem/StorageEnumerators/UniversalStorageEnumerator.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ CancellationToken cancellationToken
262262
{
263263
if (file is ShortcutStorageFile linkFile)
264264
{
265-
var isUrl = linkFile.Name.EndsWith(".url", StringComparison.OrdinalIgnoreCase);
265+
var isUrl = FileExtensionHelpers.IsWebLinkFile(linkFile.Name);
266266
return new ShortcutItem(file.FolderRelativeId)
267267
{
268268
PrimaryItemAttribute = StorageItemTypes.File,

src/Files.App/Filesystem/StorageEnumerators/Win32StorageEnumerator.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,9 @@ CancellationToken cancellationToken
303303
IsSymLink = true
304304
};
305305
}
306-
else if (findData.cFileName.EndsWith(".lnk", StringComparison.Ordinal) || findData.cFileName.EndsWith(".url", StringComparison.Ordinal))
306+
else if (FileExtensionHelpers.IsShortcutOrUrlFile(findData.cFileName))
307307
{
308-
var isUrl = findData.cFileName.EndsWith(".url", StringComparison.OrdinalIgnoreCase);
308+
var isUrl = FileExtensionHelpers.IsWebLinkFile(findData.cFileName);
309309
var shInfo = await ParseLinkAsync(itemPath);
310310
if (shInfo is null)
311311
{
@@ -393,12 +393,12 @@ private async static Task<ShellLinkItem> ParseLinkAsync(string linkPath)
393393
{
394394
try
395395
{
396-
if (linkPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))
396+
if (FileExtensionHelpers.IsShortcutFile(linkPath))
397397
{
398398
using var link = new ShellLink(linkPath, LinkResolution.NoUIWithMsgPump, default, TimeSpan.FromMilliseconds(100));
399399
return ShellFolderExtensions.GetShellLinkItem(link);
400400
}
401-
else if (linkPath.EndsWith(".url", StringComparison.OrdinalIgnoreCase))
401+
else if (FileExtensionHelpers.IsWebLinkFile(linkPath))
402402
{
403403
var linkUrl = await Win32API.StartSTATask(() =>
404404
{

src/Files.App/Filesystem/StorageItems/NativeStorageFile.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class NativeStorageFile : BaseStorageFile
2727
public override string FileType => IO.Path.GetExtension(Name);
2828
public override string FolderRelativeId => $"0\\{Name}";
2929

30-
public bool IsShortcut => FileType.Equals(".lnk", StringComparison.OrdinalIgnoreCase) || FileType.Equals(".url", StringComparison.OrdinalIgnoreCase);
30+
public bool IsShortcut => FileExtensionHelpers.IsShortcutOrUrlFile(FileType);
3131
public bool IsAlternateStream => System.Text.RegularExpressions.Regex.IsMatch(Path, @"\w:\w");
3232

3333
public override string DisplayType
@@ -164,7 +164,7 @@ private static bool CheckAccess(string path)
164164

165165
private static bool IsNativePath(string path)
166166
{
167-
var isShortcut = path.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".url", StringComparison.OrdinalIgnoreCase);
167+
var isShortcut = FileExtensionHelpers.IsShortcutOrUrlFile(path);
168168
var isAlternateStream = System.Text.RegularExpressions.Regex.IsMatch(path, @"\w:\w");
169169
return isShortcut || isAlternateStream;
170170
}

src/Files.App/Helpers/FileExtensionHelpers.cs

+18-9
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static bool IsImageFile(string? fileExtensionToCheck)
3131
public static bool IsPowerShellFile(string fileExtensionToCheck)
3232
{
3333
return !string.IsNullOrEmpty(fileExtensionToCheck) &&
34-
fileExtensionToCheck.Equals(".ps1", StringComparison.OrdinalIgnoreCase);
34+
fileExtensionToCheck.Equals(".ps1", StringComparison.OrdinalIgnoreCase);
3535
}
3636

3737
/// <summary>
@@ -65,7 +65,7 @@ public static bool IsBrowsableZipFile(string? filePath, out string? ext)
6565
public static bool IsInfFile(string? fileExtensionToCheck)
6666
{
6767
return !string.IsNullOrWhiteSpace(fileExtensionToCheck) &&
68-
fileExtensionToCheck.Equals(".inf", StringComparison.OrdinalIgnoreCase);
68+
fileExtensionToCheck.Equals(".inf", StringComparison.OrdinalIgnoreCase);
6969
}
7070

7171
/// <summary>
@@ -87,16 +87,25 @@ public static bool IsFontFile(string? fileExtensionToCheck)
8787
}
8888

8989
/// <summary>
90-
/// Check if the file extension is a shortcut file.
90+
/// Check if the file path is a shortcut file.
9191
/// </summary>
92-
/// <param name="fileExtensionToCheck">The file extension to check.</param>
93-
/// <returns><c>true</c> if the fileExtensionToCheck is a shortcute file;
92+
/// <param name="filePathToCheck">The file path to check.</param>
93+
/// <returns><c>true</c> if the filePathToCheck is a shortcut file;
9494
/// otherwise <c>false</c>.</returns>
95-
/// <remarks>Font file type is .lnkf</remarks>
96-
public static bool IsShortcutFile(string? fileExtensionToCheck)
95+
/// <remarks>Shortcut file type is .lnk</remarks>
96+
public static bool IsShortcutFile(string? filePathToCheck)
9797
{
98-
return !string.IsNullOrWhiteSpace(fileExtensionToCheck) &&
99-
fileExtensionToCheck.Equals(".lnk", StringComparison.OrdinalIgnoreCase);
98+
return !string.IsNullOrWhiteSpace(filePathToCheck) &&
99+
filePathToCheck.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase);
100+
}
101+
102+
public static bool IsWebLinkFile(string? filePathToCheck)
103+
{
104+
return !string.IsNullOrWhiteSpace(filePathToCheck) &&
105+
filePathToCheck.EndsWith(".url", StringComparison.OrdinalIgnoreCase);
100106
}
107+
108+
public static bool IsShortcutOrUrlFile(string? filePathToCheck)
109+
=> IsShortcutFile(filePathToCheck) || IsWebLinkFile(filePathToCheck);
101110
}
102111
}

src/Files.App/Helpers/FileOperationsHelpers.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -550,12 +550,12 @@ public static void TryCancelOperation(string operationId)
550550
{
551551
try
552552
{
553-
if (linkPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))
553+
if (FileExtensionHelpers.IsShortcutFile(linkPath))
554554
{
555555
using var link = new ShellLink(linkPath, LinkResolution.NoUIWithMsgPump, default, TimeSpan.FromMilliseconds(100));
556556
return Task.FromResult((string.Empty, ShellFolderExtensions.GetShellLinkItem(link)));
557557
}
558-
else if (linkPath.EndsWith(".url", StringComparison.OrdinalIgnoreCase))
558+
else if (FileExtensionHelpers.IsWebLinkFile(linkPath))
559559
{
560560
return Win32API.StartSTATask(() =>
561561
{
@@ -579,14 +579,14 @@ public static Task<bool> CreateOrUpdateLinkAsync(string linkSavePath, string tar
579579
{
580580
try
581581
{
582-
if (linkSavePath.EndsWith(".lnk", StringComparison.Ordinal))
582+
if (FileExtensionHelpers.IsShortcutFile(linkSavePath))
583583
{
584584
using var newLink = new ShellLink(targetPath, arguments, workingDirectory);
585585
newLink.RunAsAdministrator = runAsAdmin;
586586
newLink.SaveAs(linkSavePath); // Overwrite if exists
587587
return Task.FromResult(true);
588588
}
589-
else if (linkSavePath.EndsWith(".url", StringComparison.Ordinal))
589+
else if (FileExtensionHelpers.IsWebLinkFile(linkSavePath))
590590
{
591591
return Win32API.StartSTATask(() =>
592592
{

src/Files.App/Helpers/FileThumbnailHelper.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static async Task<byte[]> LoadIconFromStorageItemAsync(IStorageItem item,
4848

4949
public static async Task<byte[]> LoadIconFromPathAsync(string filePath, uint thumbnailSize, ThumbnailMode thumbnailMode, bool isFolder = false)
5050
{
51-
if (!filePath.EndsWith(".lnk", StringComparison.Ordinal) && !filePath.EndsWith(".url", StringComparison.Ordinal))
51+
if (!FileExtensionHelpers.IsShortcutOrUrlFile(filePath))
5252
{
5353
var item = await StorageHelpers.ToStorageItem<IStorageItem>(filePath);
5454
if (item is not null)

src/Files.App/Helpers/NavigationHelpers.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public static async Task<bool> OpenPath(string path, IShellPage associatedInstan
119119
bool isHiddenItem = NativeFileOperationsHelper.HasFileAttribute(path, System.IO.FileAttributes.Hidden);
120120
bool isDirectory = NativeFileOperationsHelper.HasFileAttribute(path, System.IO.FileAttributes.Directory);
121121
bool isReparsePoint = NativeFileOperationsHelper.HasFileAttribute(path, System.IO.FileAttributes.ReparsePoint);
122-
bool isShortcut = path.EndsWith(".lnk", StringComparison.Ordinal) || path.EndsWith(".url", StringComparison.Ordinal);
122+
bool isShortcut = FileExtensionHelpers.IsShortcutOrUrlFile(path);
123123
FilesystemResult opened = (FilesystemResult)false;
124124

125125
var shortcutInfo = new ShellLinkItem();
@@ -248,9 +248,9 @@ private static async Task<FilesystemResult> OpenDirectory(string path, IShellPag
248248

249249
var opened = (FilesystemResult)false;
250250
bool isHiddenItem = NativeFileOperationsHelper.HasFileAttribute(path, System.IO.FileAttributes.Hidden);
251-
bool IsShortcut = path.EndsWith(".lnk", StringComparison.Ordinal) || path.EndsWith(".url", StringComparison.Ordinal); // Determine
251+
bool isShortcut = FileExtensionHelpers.IsShortcutOrUrlFile(path);
252252

253-
if (IsShortcut)
253+
if (isShortcut)
254254
{
255255
if (string.IsNullOrEmpty(shortcutInfo.TargetPath))
256256
{
@@ -339,16 +339,17 @@ private static async Task<FilesystemResult> OpenFile(string path, IShellPage ass
339339
{
340340
var opened = (FilesystemResult)false;
341341
bool isHiddenItem = NativeFileOperationsHelper.HasFileAttribute(path, System.IO.FileAttributes.Hidden);
342-
bool IsShortcut = path.EndsWith(".lnk", StringComparison.Ordinal) || path.EndsWith(".url", StringComparison.Ordinal) || !string.IsNullOrEmpty(shortcutInfo.TargetPath);
343-
if (IsShortcut)
342+
bool isShortcut = FileExtensionHelpers.IsShortcutOrUrlFile(path) || !string.IsNullOrEmpty(shortcutInfo.TargetPath);
343+
344+
if (isShortcut)
344345
{
345346
if (string.IsNullOrEmpty(shortcutInfo.TargetPath))
346347
{
347348
await Win32Helpers.InvokeWin32ComponentAsync(path, associatedInstance, args);
348349
}
349350
else
350351
{
351-
if (!path.EndsWith(".url", StringComparison.Ordinal))
352+
if (!FileExtensionHelpers.IsWebLinkFile(path))
352353
{
353354
StorageFileWithPath childFile = await associatedInstance.FilesystemViewModel.GetFileWithPathFromPathAsync(shortcutInfo.TargetPath);
354355
if (childFile is not null)

src/Files.App/Helpers/StorageHelpers.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static async Task<TRequested> ToStorageItem<TRequested>(string path) wher
2525
FilesystemResult<BaseStorageFile> file = null;
2626
FilesystemResult<BaseStorageFolder> folder = null;
2727

28-
if (path.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".url", StringComparison.OrdinalIgnoreCase))
28+
if (FileExtensionHelpers.IsShortcutOrUrlFile(path))
2929
{
3030
// TODO: In the future, when IStorageItemWithPath will inherit from IStorageItem,
3131
// we could implement this code here for getting .lnk files

src/Files.App/Shell/Win32Shell.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Files.Shared;
1+
using Files.App.Helpers;
2+
using Files.Shared;
23
using System;
34
using System.Collections.Generic;
45
using System.IO;
@@ -97,14 +98,14 @@ public static (bool HasRecycleBin, long NumItems, long BinSize) QueryRecycleBin(
9798

9899
try
99100
{
100-
if (filePath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))
101+
if (FileExtensionHelpers.IsShortcutFile(filePath))
101102
{
102103
using var link = new ShellLink(filePath, LinkResolution.NoUIWithMsgPump, default, TimeSpan.FromMilliseconds(100));
103104
targetPath = link.TargetPath;
104105
return ShellFolderExtensions.GetShellLinkItem(link);
105106
}
106107

107-
if (filePath.EndsWith(".url", StringComparison.OrdinalIgnoreCase))
108+
if (FileExtensionHelpers.IsWebLinkFile(filePath))
108109
{
109110
targetPath = await Win32API.StartSTATask(() =>
110111
{

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public override void GetBaseProperties()
7171
ViewModel.ShortcutItemWorkingDirVisibility = Item.IsLinkItem || shortcutItem.IsSymLink ? false : true;
7272
ViewModel.ShortcutItemArguments = shortcutItem.Arguments;
7373
ViewModel.ShortcutItemArgumentsVisibility = Item.IsLinkItem || shortcutItem.IsSymLink ? false : true;
74-
ViewModel.IsSelectedItemShortcut = ".lnk".Equals(Item.FileExtension, StringComparison.OrdinalIgnoreCase);
74+
ViewModel.IsSelectedItemShortcut = FileExtensionHelpers.IsShortcutFile(Item.FileExtension);
7575
ViewModel.ShortcutItemOpenLinkCommand = new RelayCommand(async () =>
7676
{
7777
if (Item.IsLinkItem)

src/Files.App/ViewModels/Widgets/Bundles/BundleContainerViewModel.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -361,10 +361,10 @@ private async Task Drop(DragEventArgs e)
361361

362362
IStorageItem item = await StorageHelpers.ToStorageItem<IStorageItem>(itemPath);
363363

364-
if (item is not null || (itemPath.EndsWith(".lnk", StringComparison.Ordinal) || itemPath.EndsWith(".url", StringComparison.Ordinal)))
364+
if (item is not null || FileExtensionHelpers.IsShortcutOrUrlFile(itemPath))
365365
{
366366
if (await AddItemFromPath(itemPath,
367-
itemPath.EndsWith(".lnk", StringComparison.Ordinal) || itemPath.EndsWith(".url", StringComparison.Ordinal) ? FilesystemItemType.File : (item.IsOfType(StorageItemTypes.Folder) ? FilesystemItemType.Directory : FilesystemItemType.File)))
367+
FileExtensionHelpers.IsShortcutOrUrlFile(itemPath) ? FilesystemItemType.File : (item.IsOfType(StorageItemTypes.Folder) ? FilesystemItemType.Directory : FilesystemItemType.File)))
368368
{
369369
itemsAdded = true;
370370
}

src/Files.App/ViewModels/Widgets/Bundles/BundleItemViewModel.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public string Name
6262
fileName = System.IO.Path.GetFileName(this.Path);
6363
}
6464

65-
if (fileName.EndsWith(".lnk", StringComparison.Ordinal) || fileName.EndsWith(".url", StringComparison.Ordinal))
65+
if (FileExtensionHelpers.IsShortcutOrUrlFile(fileName))
6666
{
6767
fileName = fileName.Remove(fileName.Length - 4);
6868
}

0 commit comments

Comments
 (0)