Skip to content

Commit

Permalink
Fix dangling file handle on windows. (#60)
Browse files Browse the repository at this point in the history
  • Loading branch information
atmoos authored Feb 6, 2024
2 parents 8f920a3 + 87e9e91 commit e24a7b8
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 21 deletions.
46 changes: 26 additions & 20 deletions source/Quantities.Benchmark/Exporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,40 @@ public static class Exporter

public static void Export(IEnumerable<Summary> summaries)
{
var sourceDir = FindSourceDir();
var sourceFiles = FindSourceFiles();
foreach (var summary in summaries) {
Export(summary, sourceDir);
Export(summary, sourceFiles);
}
}
public static void Export(Summary summary) => Export(summary, FindSourceDir());
private static void Export(Summary summary, DirectoryInfo sourceDir)
=> Export(summary, MarkdownExporter.Console, sourceDir);
private static void Export(Summary summary, IExporter exporter, DirectoryInfo sourceDir)
public static void Export(Summary summary) => Export(summary, FindSourceFiles());
private static void Export(Summary summary, List<FileInfo> allFiles)
=> Export(summary, MarkdownExporter.Console, allFiles);
private static void Export(Summary summary, IExporter exporter, List<FileInfo> allFiles)
{
foreach (var file in exporter.ExportToFiles(summary, logger)) {
var name = BenchmarkName(file);
var fileName = $"{name}.cs";
Console.WriteLine($"Exporting: {name}");
var sourceFile = sourceDir.EnumerateFiles("*.cs", SearchOption.AllDirectories).Single(f => f.Name.EndsWith(fileName));
var sourceFile = allFiles.Single(f => f.Name.EndsWith(fileName));
UpdateSourceFile(sourceFile, File.ReadAllText(file));
File.Delete(file);
}
}
private static void UpdateSourceFile(FileInfo source, String result)
{
var tmpFile = $"{source.FullName}.tmp";
using var reader = source.OpenText();
using var writer = File.CreateText(tmpFile);
try {
Update(source, tmpFile, result);
}
finally {
File.Move(tmpFile, source.FullName, overwrite: true);
}

static void Update(FileInfo source, String dest, String result)
{
String line;
using var reader = source.OpenText();
using var writer = File.CreateText(dest);
while ((line = reader.ReadLine()) != null) {
if (line.StartsWith(mark)) {
// overwrite existing result
Expand All @@ -48,19 +56,17 @@ private static void UpdateSourceFile(FileInfo source, String result)
// No mark found, first time appending a result
writer.WriteLine();
Append(writer, result);
}
finally {
File.Move(tmpFile, source.FullName, overwrite: true);
}

static void Append(TextWriter writer, String result)
{
writer.WriteLine(mark);
writer.Write(result);
writer.WriteLine("*/");
static void Append(TextWriter writer, String result)
{
writer.WriteLine(mark);
writer.Write(result);
writer.WriteLine("*/");
}
}
}
private static DirectoryInfo FindSourceDir()

private static List<FileInfo> FindSourceFiles()
{
var myAssembly = typeof(Exporter).Assembly;
var assemblyName = myAssembly.GetName().Name;
Expand All @@ -72,7 +78,7 @@ private static DirectoryInfo FindSourceDir()
throw new Exception($"Failed finding source dir @ {prev}");
}
}
return dir;
return dir.EnumerateFiles("*.cs", SearchOption.AllDirectories).ToList();
}
private static String BenchmarkName(ReadOnlySpan<Char> reportPath)
{
Expand Down
2 changes: 1 addition & 1 deletion source/Quantities/Quantities.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<PropertyGroup>
<Version>1.1.0</Version>
<RootNamespace>Quantities</RootNamespace>
<Description>Type-safe and efficent handling of physical quantities.</Description>
<Description>Type-safe and efficient handling of physical quantities.</Description>
</PropertyGroup>

</Project>

0 comments on commit e24a7b8

Please sign in to comment.