Skip to content

Commit b5012d1

Browse files
committed
Add file reader parallelization options
1 parent 2f210cb commit b5012d1

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

QuickList/Application/Configuration.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ internal sealed class Configuration
5959

6060
internal Status Status { get; set; }
6161

62+
/// <summary>
63+
/// How many threads to run at once for file reader?
64+
/// </summary>
65+
internal int FileReaderParallelism { get; set; }
66+
6267

6368
internal static Configuration Parse(string iniFile)
6469
{
@@ -68,14 +73,17 @@ internal static Configuration Parse(string iniFile)
6873
HeaderFile = IniReader.ReadValue("ListMagic", "HeaderFile", iniFile),
6974
Trigger = IniReader.ReadValue("ListMagic", "trigger", iniFile),
7075
OutputFolder = IniReader.ReadValue("ListMagic", "ListLocation", iniFile),
71-
ShowUi = IniReader.ReadValue("ListMagic", "Auto", iniFile) == "N",
76+
ShowUi = string.Compare(IniReader.ReadValue("ListMagic", "Auto", iniFile, "Y").Trim(), "N", StringComparison.OrdinalIgnoreCase) == 0,
7277
ListName = Path.GetFileNameWithoutExtension(iniFile),
7378
FileInfo = (FileInfoLevel)Enum.Parse(typeof(FileInfoLevel), IniReader.ReadValue("QuickList", "FileInfo", iniFile, nameof(FileInfoLevel.Size))),
7479
FolderHandling = (FolderHandling)Enum.Parse(typeof(FolderHandling),
7580
IniReader.ReadValue("QuickList", "FolderHandling", iniFile, nameof(FolderHandling.PartialFolders))),
7681
ForceShellMedia = IniReader.ReadValue("QuickList", "ForceShellMedia", iniFile, "0") == "1"
7782
};
7883

84+
int.TryParse(IniReader.ReadValue("QuickList", "FileReaderParallelism", "0"), out var fileReaderParallelism);
85+
configuration.FileReaderParallelism = fileReaderParallelism <= 0 ? Environment.ProcessorCount : fileReaderParallelism;
86+
7987
var dirsFile = IniReader.ReadValue("ListMagic", "DirsFile", iniFile);
8088

8189
if (!File.Exists(dirsFile))
@@ -113,6 +121,7 @@ internal void Update()
113121
IniReader.WriteValue("QuickList", "FolderHandling", FolderHandling.ToString(), IniFile);
114122
IniReader.WriteValue("QuickList", "FileInfo", FileInfo.ToString(), IniFile);
115123
IniReader.WriteValue("QuickList", "ForceShellMedia", ForceShellMedia ? "1" : "0", IniFile);
124+
IniReader.WriteValue("QuickList", "FileReaderParallelism", FileReaderParallelism.ToString() , IniFile);
116125
}
117126
}
118127
}

QuickList/Application/FileReader.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private static bool FindNextFile(string path, out List<Entry> files)
135135
if (!findData.cFileName.Equals(".", StringComparison.OrdinalIgnoreCase) && !findData.cFileName.Equals("..",
136136
StringComparison.OrdinalIgnoreCase))
137137
{
138-
var fullPath = string.Concat(path, "\\", findData.cFileName);;
138+
var fullPath = string.Concat(path, "\\", findData.cFileName);
139139
// Check if this is a directory and not a symbolic link since symbolic links could lead to repeated files and folders as well as infinite loops.
140140
if (findData.dwFileAttributes.HasFlag(FileAttributes.Directory) && !findData.dwFileAttributes.HasFlag(FileAttributes.ReparsePoint))
141141
{
@@ -166,7 +166,7 @@ private static bool FindNextFile(string path, out List<Entry> files)
166166
}
167167

168168

169-
private static List<Entry> ParallelFindNextFile(string path)
169+
private List<Entry> ParallelFindNextFile(string path)
170170
{
171171
var fileList = new ConcurrentBag<Entry>();
172172
var directoryList = new List<string>(32);
@@ -199,7 +199,7 @@ private static List<Entry> ParallelFindNextFile(string path)
199199

200200
directoryList
201201
.AsParallel()
202-
.WithDegreeOfParallelism(Environment.ProcessorCount)
202+
.WithDegreeOfParallelism(_configuration.FileReaderParallelism)
203203
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
204204
.ForAll(x =>
205205
{

QuickList/Program.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ private static void Main(params string[] parameters)
5757
InputFolders = new List<string> { @"c:\temp\", @"C:\Dev" },
5858
OutputFolder = @"c:\temp\out",
5959
ListName = "audio",
60-
IniFile = @"D:\mIRC\OmenServe\ListMagic\testaudio\testaudio.ini",
60+
IniFile = @"c:\temp\out\testaudio.ini",
6161
ShowUi = true,
62-
ForceShellMedia = false
62+
ForceShellMedia = false,
63+
FileReaderParallelism = 1
6364
};
6465
#endif
6566
configuration.Validate();

0 commit comments

Comments
 (0)