Skip to content

Commit d7abae1

Browse files
committed
Add Cancellation token for file system enumeration
1 parent e9e99ab commit d7abae1

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

Plugins/Flow.Launcher.Plugin.Explorer/Search/DirectoryInfo/DirectoryInfoSearch.cs

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Collections.Generic;
55
using System.IO;
66
using System.Linq;
7+
using System.Threading;
78

89
namespace Flow.Launcher.Plugin.Explorer.Search.DirectoryInfo
910
{
@@ -16,14 +17,18 @@ public DirectoryInfoSearch(PluginInitContext context)
1617
resultManager = new ResultManager(context);
1718
}
1819

19-
internal List<Result> TopLevelDirectorySearch(Query query, string search)
20+
internal List<Result> TopLevelDirectorySearch(Query query, string search, CancellationToken token)
2021
{
2122
var criteria = ConstructSearchCriteria(search);
2223

23-
if (search.LastIndexOf(Constants.AllFilesFolderSearchWildcard) > search.LastIndexOf(Constants.DirectorySeperator))
24-
return DirectorySearch(SearchOption.AllDirectories, query, search, criteria);
24+
if (search.LastIndexOf(Constants.AllFilesFolderSearchWildcard) >
25+
search.LastIndexOf(Constants.DirectorySeperator))
26+
return DirectorySearch(new EnumerationOptions
27+
{
28+
RecurseSubdirectories = true
29+
}, query, search, criteria, token);
2530

26-
return DirectorySearch(SearchOption.TopDirectoryOnly, query, search, criteria);
31+
return DirectorySearch(null, query, search, criteria, token); // null will be passed as default
2732
}
2833

2934
public string ConstructSearchCriteria(string search)
@@ -45,7 +50,8 @@ public string ConstructSearchCriteria(string search)
4550
return incompleteName;
4651
}
4752

48-
private List<Result> DirectorySearch(SearchOption searchOption, Query query, string search, string searchCriteria)
53+
private List<Result> DirectorySearch(EnumerationOptions enumerationOption, Query query, string search,
54+
string searchCriteria, CancellationToken token)
4955
{
5056
var results = new List<Result>();
5157

@@ -58,38 +64,38 @@ private List<Result> DirectorySearch(SearchOption searchOption, Query query, str
5864
{
5965
var directoryInfo = new System.IO.DirectoryInfo(path);
6066

61-
foreach (var fileSystemInfo in directoryInfo.EnumerateFileSystemInfos(searchCriteria, searchOption))
67+
foreach (var fileSystemInfo in directoryInfo.EnumerateFileSystemInfos(searchCriteria, enumerationOption))
6268
{
63-
if ((fileSystemInfo.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue;
64-
6569
if (fileSystemInfo is System.IO.DirectoryInfo)
6670
{
67-
folderList.Add(resultManager.CreateFolderResult(fileSystemInfo.Name, fileSystemInfo.FullName, fileSystemInfo.FullName, query, true, false));
71+
folderList.Add(resultManager.CreateFolderResult(fileSystemInfo.Name, fileSystemInfo.FullName,
72+
fileSystemInfo.FullName, query, true, false));
6873
}
6974
else
7075
{
7176
fileList.Add(resultManager.CreateFileResult(fileSystemInfo.FullName, query, true, false));
7277
}
78+
79+
if (token.IsCancellationRequested)
80+
return null;
7381
}
7482
}
7583
catch (Exception e)
7684
{
77-
if (e is UnauthorizedAccessException || e is ArgumentException)
78-
{
79-
results.Add(new Result { Title = e.Message, Score = 501 });
85+
if (!(e is ArgumentException)) throw e;
86+
87+
results.Add(new Result {Title = e.Message, Score = 501});
8088

81-
return results;
82-
}
89+
return results;
8390

8491
#if DEBUG // Please investigate and handle error from DirectoryInfo search
85-
throw e;
8692
#else
8793
Log.Exception($"|Flow.Launcher.Plugin.Explorer.DirectoryInfoSearch|Error from performing DirectoryInfoSearch", e);
88-
#endif
94+
#endif
8995
}
9096

91-
// Intial ordering, this order can be updated later by UpdateResultView.MainViewModel based on history of user selection.
97+
// Initial ordering, this order can be updated later by UpdateResultView.MainViewModel based on history of user selection.
9298
return results.Concat(folderList.OrderBy(x => x.Title)).Concat(fileList.OrderBy(x => x.Title)).ToList();
9399
}
94100
}
95-
}
101+
}

Plugins/Flow.Launcher.Plugin.Explorer/Search/SearchManager.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ internal async Task<List<Result>> SearchAsync(Query query, CancellationToken tok
8181
return null;
8282

8383
results.AddRange(await TopLevelDirectorySearchBehaviourAsync(WindowsIndexTopLevelFolderSearchAsync,
84-
DirectoryInfoClassSearch,
85-
useIndexSearch,
86-
query,
87-
locationPath,
88-
token).ConfigureAwait(false));
89-
84+
DirectoryInfoClassSearch,
85+
useIndexSearch,
86+
query,
87+
locationPath,
88+
token).ConfigureAwait(false));
89+
9090
return results;
9191
}
9292

@@ -109,23 +109,23 @@ public bool IsFileContentSearch(string actionKeyword)
109109
return actionKeyword == settings.FileContentSearchActionKeyword;
110110
}
111111

112-
private List<Result> DirectoryInfoClassSearch(Query query, string querySearch)
112+
private List<Result> DirectoryInfoClassSearch(Query query, string querySearch, CancellationToken token)
113113
{
114114
var directoryInfoSearch = new DirectoryInfoSearch(context);
115115

116-
return directoryInfoSearch.TopLevelDirectorySearch(query, querySearch);
116+
return directoryInfoSearch.TopLevelDirectorySearch(query, querySearch, token);
117117
}
118118

119119
public async Task<List<Result>> TopLevelDirectorySearchBehaviourAsync(
120120
Func<Query, string, CancellationToken, Task<List<Result>>> windowsIndexSearch,
121-
Func<Query, string, List<Result>> directoryInfoClassSearch,
121+
Func<Query, string, CancellationToken, List<Result>> directoryInfoClassSearch,
122122
bool useIndexSearch,
123123
Query query,
124124
string querySearchString,
125125
CancellationToken token)
126126
{
127127
if (!useIndexSearch)
128-
return directoryInfoClassSearch(query, querySearchString);
128+
return directoryInfoClassSearch(query, querySearchString, token);
129129

130130
return await windowsIndexSearch(query, querySearchString, token);
131131
}

0 commit comments

Comments
 (0)