Look at each source file of a scenery once

The watch of scenery files asked three times per file, whether it is there,
its time and its size, every two seconds for every source of every scenery.
One look gives all three.
This commit is contained in:
maj00r
2026-11-03 21:51:56 +01:00
parent 9eb10fc9bd
commit d68999dfb7
4 changed files with 13 additions and 3 deletions

View File

@@ -200,6 +200,9 @@ public sealed class InMemoryFileSystem : IFileSystem
/// <summary>Files added through <see cref="WithExecutable"/> carry the execute bit.</summary> /// <summary>Files added through <see cref="WithExecutable"/> carry the execute bit.</summary>
public long GetFileSize(string path) => Bytes(path).LongLength; public long GetFileSize(string path) => Bytes(path).LongLength;
public (DateTime LastWriteUtc, long Size)? LastWriteAndSize(string path) =>
FileExists(path) ? (GetLastWriteTimeUtc(path), GetFileSize(path)) : null;
public bool IsExecutable(string path) => _executable.Contains(Normalize(path)); public bool IsExecutable(string path) => _executable.Contains(Normalize(path));
public InMemoryFileSystem WithExecutable(string path, string contents = "\u007fELF") public InMemoryFileSystem WithExecutable(string path, string contents = "\u007fELF")

View File

@@ -55,6 +55,9 @@ public interface IFileSystem
long GetFileSize(string path); long GetFileSize(string path);
/// <summary>A file's time and size in one look; null when there is no file.</summary>
(DateTime LastWriteUtc, long Size)? LastWriteAndSize(string path);
bool IsExecutable(string path); bool IsExecutable(string path);
/// <summary>Where the symbolic link at <paramref name="path"/> points, or null for anything else.</summary> /// <summary>Where the symbolic link at <paramref name="path"/> points, or null for anything else.</summary>

View File

@@ -11,9 +11,7 @@ public readonly record struct FileStamp(DateTime LastWriteUtc, long Size)
{ {
try try
{ {
return files.FileExists(path) return files.LastWriteAndSize(path) is { } stat ? new FileStamp(stat.LastWriteUtc, stat.Size) : null;
? new FileStamp(files.GetLastWriteTimeUtc(path), files.GetFileSize(path))
: null;
} }
catch (Exception) catch (Exception)
{ {

View File

@@ -110,6 +110,12 @@ public sealed class PhysicalFileSystem : IFileSystem
public long GetFileSize(string path) => new FileInfo(path).Length; public long GetFileSize(string path) => new FileInfo(path).Length;
public (DateTime LastWriteUtc, long Size)? LastWriteAndSize(string path)
{
var info = new FileInfo(path);
return info.Exists ? (info.LastWriteTimeUtc, info.Length) : null;
}
public bool IsExecutable(string path) public bool IsExecutable(string path)
{ {
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())