From f8919abea84259216b6c2ebd93884a5ebeaac4bb Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Fri, 24 Jun 2022 18:53:56 +0200 Subject: [PATCH] calculate and display local cache size on cache changes, add clear cache button --- .../Factories/CharacterDataFactory.cs | 1 - MareSynchronos/Factories/FileCacheFactory.cs | 48 ------------ MareSynchronos/Managers/CharacterManager.cs | 2 + MareSynchronos/Managers/FileCacheManager.cs | 74 ++++++++++++++++--- MareSynchronos/Plugin.cs | 2 +- MareSynchronos/UI/PluginUI.cs | 14 +++- MareSynchronos/UI/UIShared.cs | 14 ++-- 7 files changed, 87 insertions(+), 68 deletions(-) delete mode 100644 MareSynchronos/Factories/FileCacheFactory.cs diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 44c23cb..027ca27 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -1,6 +1,5 @@ using System.Diagnostics; using System.Threading; -using Dalamud.Game.ClientState; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.System.Resource; diff --git a/MareSynchronos/Factories/FileCacheFactory.cs b/MareSynchronos/Factories/FileCacheFactory.cs deleted file mode 100644 index bbd627b..0000000 --- a/MareSynchronos/Factories/FileCacheFactory.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using MareSynchronos.FileCacheDB; -using MareSynchronos.Utils; - -namespace MareSynchronos.Factories -{ - public class FileCacheFactory - { - public FileCache Create(string file) - { - FileInfo fileInfo = new(file); - if (IsFileLocked(fileInfo)) - { - throw new FileLoadException(); - } - var sha1Hash = Crypto.GetFileHash(fileInfo.FullName); - return new FileCache() - { - Filepath = fileInfo.FullName, - Hash = sha1Hash, - LastModifiedDate = fileInfo.LastWriteTimeUtc.Ticks.ToString(), - }; - } - - public void UpdateFileCache(FileCache cache) - { - FileInfo fileInfo = new(cache.Filepath); - cache.Hash = Crypto.GetFileHash(cache.Filepath); - cache.LastModifiedDate = fileInfo.LastWriteTimeUtc.Ticks.ToString(); - } - - private bool IsFileLocked(FileInfo file) - { - try - { - using var fs = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); - } - catch - { - return true; - } - - return false; - } - } -} diff --git a/MareSynchronos/Managers/CharacterManager.cs b/MareSynchronos/Managers/CharacterManager.cs index 25b8e76..7ca62a1 100644 --- a/MareSynchronos/Managers/CharacterManager.cs +++ b/MareSynchronos/Managers/CharacterManager.cs @@ -177,5 +177,7 @@ namespace MareSynchronos.Managers } }); } + + } } diff --git a/MareSynchronos/Managers/FileCacheManager.cs b/MareSynchronos/Managers/FileCacheManager.cs index 43de84e..f3f3b3d 100644 --- a/MareSynchronos/Managers/FileCacheManager.cs +++ b/MareSynchronos/Managers/FileCacheManager.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Dalamud.Logging; -using MareSynchronos.Factories; using MareSynchronos.FileCacheDB; using MareSynchronos.Utils; @@ -14,19 +13,18 @@ namespace MareSynchronos.Managers { public class FileCacheManager : IDisposable { - private readonly FileCacheFactory _fileCacheFactory; private readonly IpcManager _ipcManager; private readonly Configuration _pluginConfiguration; private CancellationTokenSource? _scanCancellationTokenSource; private Task? _scanTask; private FileSystemWatcher? _penumbraDirWatcher; private FileSystemWatcher? _cacheDirWatcher; + public long FileCacheSize { get; set; } - public FileCacheManager(FileCacheFactory fileCacheFactory, IpcManager ipcManager, Configuration pluginConfiguration) + public FileCacheManager(IpcManager ipcManager, Configuration pluginConfiguration) { Logger.Debug("Creating " + nameof(FileCacheManager)); - _fileCacheFactory = fileCacheFactory; _ipcManager = ipcManager; _pluginConfiguration = pluginConfiguration; @@ -50,12 +48,12 @@ namespace MareSynchronos.Managers Logger.Debug("File created: " + e.FullPath); try { - var createdFileCache = _fileCacheFactory.Create(fi.FullName); + var createdFileCache = Create(fi.FullName); db.Add(createdFileCache); } catch (FileLoadException) { - Logger.Debug("File was still being written to"); + Logger.Debug("File was still being written to."); } } @@ -71,12 +69,17 @@ namespace MareSynchronos.Managers foreach (var file in newFiles) { Logger.Debug("Adding " + file); - db.Add(_fileCacheFactory.Create(file)); + db.Add(Create(file)); } } } db.SaveChanges(); + + if (e.FullPath.Contains(_pluginConfiguration.CacheFolder, StringComparison.OrdinalIgnoreCase)) + { + Task.Run(RecalculateFileCacheSize); + } } private void OnDeleted(object sender, FileSystemEventArgs e) @@ -104,6 +107,11 @@ namespace MareSynchronos.Managers } db.SaveChanges(); + + if (e.FullPath.Contains(_pluginConfiguration.CacheFolder, StringComparison.OrdinalIgnoreCase)) + { + Task.Run(RecalculateFileCacheSize); + } } private void OnModified(object sender, FileSystemEventArgs e) @@ -113,12 +121,17 @@ namespace MareSynchronos.Managers if (fi.Extension.ToLower() is not ".mdl" or ".tex" or ".mtrl") return; Logger.Debug("File changed: " + e.FullPath); using var db = new FileCacheContext(); - var modifiedFile = _fileCacheFactory.Create(fi.FullName); + var modifiedFile = Create(fi.FullName); var fileInDb = db.FileCaches.SingleOrDefault(f => f.Filepath == fi.FullName.ToLower() || modifiedFile.Hash == f.Hash); if (fileInDb == null) return; db.Remove(fileInDb); db.Add(modifiedFile); db.SaveChanges(); + + if (e.FullPath.Contains(_pluginConfiguration.CacheFolder, StringComparison.OrdinalIgnoreCase)) + { + Task.Run(RecalculateFileCacheSize); + } } public long CurrentFileProgress { get; private set; } @@ -185,7 +198,7 @@ namespace MareSynchronos.Managers } FileInfo fileInfo = new(cache.Filepath); if (fileInfo.LastWriteTimeUtc.Ticks == long.Parse(cache.LastModifiedDate)) return; - fileCachesToAdd.Add(_fileCacheFactory.Create(cache.Filepath)); + fileCachesToAdd.Add(Create(cache.Filepath)); fileCachesToDelete.Add(cache); } @@ -204,7 +217,7 @@ namespace MareSynchronos.Managers }, file => { - fileCachesToAdd.Add(_fileCacheFactory.Create(file.Key)); + fileCachesToAdd.Add(Create(file.Key)); var files = CurrentFileProgress; Interlocked.Increment(ref files); @@ -275,6 +288,47 @@ namespace MareSynchronos.Managers _cacheDirWatcher.Filters.Add("*.tex"); _cacheDirWatcher.Error += (sender, args) => PluginLog.Error(args.GetException(), "Error in Cache Dir Watcher"); + + Task.Run(RecalculateFileCacheSize); + } + + private void RecalculateFileCacheSize() + { + FileCacheSize = 0; + foreach (var file in Directory.EnumerateFiles(_pluginConfiguration.CacheFolder)) + { + FileCacheSize += new FileInfo(file).Length; + } + } + + private bool IsFileLocked(FileInfo file) + { + try + { + using var fs = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); + } + catch + { + return true; + } + + return false; + } + + public FileCache Create(string file) + { + FileInfo fileInfo = new(file); + if (IsFileLocked(fileInfo)) + { + throw new FileLoadException(); + } + var sha1Hash = Crypto.GetFileHash(fileInfo.FullName); + return new FileCache() + { + Filepath = fileInfo.FullName, + Hash = sha1Hash, + LastModifiedDate = fileInfo.LastWriteTimeUtc.Ticks.ToString(), + }; } } } diff --git a/MareSynchronos/Plugin.cs b/MareSynchronos/Plugin.cs index 13f17d0..0fb6a40 100644 --- a/MareSynchronos/Plugin.cs +++ b/MareSynchronos/Plugin.cs @@ -51,7 +51,7 @@ namespace MareSynchronos _apiController = new ApiController(_configuration); _ipcManager = new IpcManager(_pluginInterface); - _fileCacheManager = new FileCacheManager(new FileCacheFactory(), _ipcManager, _configuration); + _fileCacheManager = new FileCacheManager(_ipcManager, _configuration); _dalamudUtil = new DalamudUtil(_clientState, _objectTable); _characterCacheManager = new CharacterCacheManager(_clientState, framework, _objectTable, _apiController, _dalamudUtil, _ipcManager); diff --git a/MareSynchronos/UI/PluginUI.cs b/MareSynchronos/UI/PluginUI.cs index 3ab5cf0..5053cab 100644 --- a/MareSynchronos/UI/PluginUI.cs +++ b/MareSynchronos/UI/PluginUI.cs @@ -4,6 +4,7 @@ using Dalamud.Interface.Windowing; using ImGuiNET; using MareSynchronos.WebAPI; using System; +using System.IO; using System.Linq; using System.Threading.Tasks; using MareSynchronos.Utils; @@ -190,7 +191,18 @@ namespace MareSynchronos.UI { _uiShared.DrawFileScanState(); _uiShared.DrawCacheDirectorySetting(); - _uiShared.DrawParallelScansSetting(); + ImGui.Text($"Local cache size: {UiShared.ByteToString(_uiShared.FileCacheSize)}"); + ImGui.SameLine(); + if (ImGui.Button("Clear local cache")) + { + Task.Run(() => + { + foreach (var file in Directory.GetFiles(_configuration.CacheFolder)) + { + File.Delete(file); + } + }); + } ImGui.TreePop(); } } diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index 6533439..12b5713 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -15,6 +15,7 @@ namespace MareSynchronos.UI private readonly ApiController _apiController; private readonly FileCacheManager _fileCacheManager; private readonly Configuration _pluginConfiguration; + public long FileCacheSize => _fileCacheManager.FileCacheSize; public UiShared(IpcManager ipcManager, ApiController apiController, FileCacheManager fileCacheManager, Configuration pluginConfiguration) { @@ -115,16 +116,15 @@ namespace MareSynchronos.UI public static string ByteToString(long bytes) { - double output = bytes; - var suffix = new[] { "B", "KiB", "MiB", "GiB" }; - var suffixIdx = 0; - while (output / 1024.0 > 1024) + string[] suffix = { "B", "KiB", "MiB", "GiB", "TiB" }; + int i; + double dblSByte = bytes; + for (i = 0; i < suffix.Length && bytes >= 1024; i++, bytes /= 1024) { - output /= 1024.0; - suffixIdx++; + dblSByte = bytes / 1024.0; } - return output.ToString("0.00") + " " + suffix[suffixIdx]; + return $"{dblSByte:0.00} {suffix[i]}"; } private int _serverSelectionIndex = 0;