public override void Hotload(List <string> changedFiles) { // TODO smarter hotloading. Handle removed files. var loadedFileNames = new HashSet <string>(AllFiles.Keys); foreach (string file in FindConfigsInBaseDir()) { string fileName = GetFileNameFromPath(file); loadedFileNames.Remove(fileName); if (!AllFiles.TryGetValue(fileName, out var fileInfo)) { // New file, add it. var newFileInfo = ReadFile(file); AllFiles.Add(newFileInfo.Name, newFileInfo); changedFiles.Add(newFileInfo.Name); continue; } var fileSize = new FileInfo(file).Length; var modified = File.GetLastWriteTimeUtc(file); // Timestamp or size need to differ before we bother generating a checksum of the file. // Timestamps are considered different if there's at least 1 second between them. if (fileSize == fileInfo.Size && Math.Abs((modified - fileInfo.Modified).TotalSeconds) < 1f) { continue; } using (var fileStream = File.OpenRead(file)) { int checksum = Internal.ChecksumUtils.Checksum(fileStream); fileStream.Seek(0, SeekOrigin.Begin); // Update the modified timestamp and file size even if the checksum is the same. // Because we didn't early out a few lines above, we know that at least one of these values // is stale. fileInfo.Modified = modified; fileInfo.Size = fileSize; if (checksum == fileInfo.Checksum) { // The files are identical. continue; } // File has changed. Hotload it. fileInfo.Checksum = checksum; fileInfo.Modified = modified; fileInfo.Parsed = Configs.LoadDocFromStream(fileStream, file); changedFiles.Add(fileName); } } foreach (string deletedFile in loadedFileNames) { AllFiles.Remove(deletedFile); changedFiles.Add(deletedFile); } }